我正在重写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)用于可迭代的项目
答案 0 :(得分:1)
问题不在您的嵌套序列化程序中。问题出在您的模型本身中。
ForeignKey是多对一关系。按照您定义事物的方式,课程只能有一个分支和一个联系。调用字段“ branches”和“ contacts”不会改变,也不会在序列化程序中设置“ many = True”。
您需要更改模型,以便外键位于“分支”和“联系自身”上,指向“课程”。然后,序列化程序将使用相关名称。
请注意,您无需定义create
;那里的一切都应该工作。