python - 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
解决方案
问题不在于您的嵌套序列化程序。问题在于您的模型本身。
ForeignKey 是多对一的关系。按照您定义事物的方式,课程只能有一个分支和一个联系人。调用字段“分支”和“联系人”不会改变这一点,在序列化程序中设置“many=True”也不会改变。
您需要更改模型,以便 ForeignKeys 在 Branch 和 Contact 上,指向 Course。然后,序列化程序将使用相关名称。
请注意,您不需要定义create
; 那里的一切都应该正常工作。
推荐阅读
- java - 为什么我们需要导入“org.junit.Assert”静态?
- angular - 使用 Angular 单击按钮时打开并浏览文件
- servlet-filters - Unbale 以防止 PROPFIND http-method 来自servelt 过滤器
- image - 将图像插入 PDF 文档
- java - Spring Security MultiHttpSecurity 配置使我可以执行两种类型的身份验证。JWT 令牌和会话 Cookie
- python - Python slackclient oauth.access 调用返回“invalid_code”错误
- python - Django:覆盖用户查询集以从公众中过滤掉管理员/员工用户?
- reactjs - 是否可以在 React 的静态 getDerivedStateFromPRops 方法中使用 ClearInterval?
- javascript - 在js中的静态函数中将对象作为参数传递
- reactjs - 从反应应用程序读取 kubernetes pod 的 configmap 中设置的环境变量?