首页 > 解决方案 > Django“TypeError:'...'对象不可迭代”

问题描述

我需要多个值才能出现在课程的联系人中,例如电话、Facebook 等。


我正在重写创建可写嵌套字段的方法。一切都适用于“分支”。我很困惑,因为我不明白为什么 Contact 不可迭代。

模型.py:

class Branch(models.Model):
    latitude = models.CharField(max_length=50)
    longitude = models.CharField(max_length=50)
    address = models.CharField(max_length=100)

    class Meta:
        ordering = ['latitude']

    def __str__(self):
        return self.address

class Contact(models.Model):
    type = models.IntegerField(choices=TYPE, default=1)
    value = models.CharField(max_length=100, null=False)

    class Meta:
        ordering = ['type']

    def __str__(self):
        return "{} {}".format(self.type, self.value)

class Course(models.Model):
    ...
    branches = models.ForeignKey(Branch, on_delete=models.CASCADE, null=False, default=True)
    contacts = models.ForeignKey(Contact, on_delete=models.CASCADE, null=False, default=True)
    
    class Meta:
        ordering = ['name']

    def __str__(self):
        return self.name

序列化器.py:

class CourseSerializer(serializers.ModelSerializer):
    ...
    branches = BranchSerializer(many=True)
    contacts = ContactSerializer(many=True)

    class Meta:
        model = Course
        fields = ['name', 'description', 'category', 'logo', 'contacts', 'branches']
    
    def create(self, validated_data):
        branches_data = validated_data.pop('branches')
        contacts_data = validated_data.pop('contacts')
        course = Course.objects.create(**validated_data)
        for branches in branches_data:
            branch = Branch.objects.create(**branches)
            course.branches = branch
        for contacts in contacts_data:
            contact = Contact.objects.create(**contacts)
            course.contacts = contact
        return course

UPD:追溯:

File "/courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/exception.py" in inner
  34.             response = get_response(request)

File "/courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  115.                 response = self.process_exception_by_middleware(e, request)

File "/courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py" in _get_response
  113.                 response = wrapped_callback(request, *callback_args, **callback_kwargs)

File "/courseapp_task/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py" in wrapped_view
  54.         return view_func(*args, **kwargs)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/viewsets.py" in view
  114.             return self.dispatch(request, *args, **kwargs)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  505.             response = self.handle_exception(exc)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" in handle_exception
  465.             self.raise_uncaught_exception(exc)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" in raise_uncaught_exception
  476.         raise exc

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py" in dispatch
  502.             response = handler(request, *args, **kwargs)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/mixins.py" in create
  20.         headers = self.get_success_headers(serializer.data)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in data
  559.         ret = super().data

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in data
  261.                 self._data = self.to_representation(self.instance)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in to_representation
  526.                 ret[field.field_name] = field.to_representation(attribute)

File "/courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py" in to_representation
  675.             self.child.to_representation(item) for item in iterable

标签: pythondjango

解决方案


问题不在于您的嵌套序列化程序。问题在于您的模型本身。

ForeignKey 是多对一的关系。按照您定义事物的方式,课程只能有一个分支和一个联系人。调用字段“分支”和“联系人”不会改变这一点,在序列化程序中设置“many=True”也不会改变。

您需要更改模型,以便 ForeignKeys 在 Branch 和 Contact 上,指向 Course。然后,序列化程序将使用相关名称。

请注意,您不需要定义create; 那里的一切都应该正常工作。


推荐阅读