Django“ TypeError:'...'对象不可迭代”

时间:2019-11-02 22:07:53

标签: python django

我需要在课程联系人中输入多个值,例如电话,facebook等。

我正在重写create方法以使可写嵌套字段成为可能。一切都可以在“分支机构”中正常工作。我很困惑,因为我无法理解为什么Contact是不可迭代的。

Models.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

Serializers.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:跟踪:

内部文件“ /courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/exception.py”   34. response = get_response(request)

_get_response中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py”   115. response = self.process_exception_by_middleware(e,request)

_get_response中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/django/core/handlers/base.py”   113. response = wrapd_callback(request,* callback_args,** callback_kwargs)

wrapped_view中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/django/views/decorators/csrf.py”   54. return view_func(* args,** kwargs)

视图中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/viewsets.py”   114. return self.dispatch(request,* args,** kwargs)

调度中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py”   505. response = self.handle_exception(exc)

handle_exception中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py”   465. self.raise_uncaught_exception(exc)

raise_uncaught_exception中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py”   476.提高除外

调度中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/views.py”   502. response = handler(request,* args,** kwargs)

在创建文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/mixins.py”   20.标头= self.get_success_headers(serializer.data)

数据中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py”   559. ret = super()。data

数据中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py”   261. self._data = self.to_representation(self.instance)

to_representation中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py”   526. ret [field.field_name] = field.to_representation(attribute)

to_representation中的文件“ /courseapp_task/venv/lib/python3.6/site-packages/rest_framework/serializers.py”   675. self.child.to_representation(item)用于可迭代的项目

1 个答案:

答案 0 :(得分:1)

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

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

您需要更改模型,以便外键位于“分支”和“联系自身”上,指向“课程”。然后,序列化程序将使用相关名称。

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