我必须建立模型(Meeting 和 Meetingmemeber)来保存 session 和受邀人员的信息,我使用这样的序列化器:
class MeetingSerializer(serializers.ModelSerializer):
location = MeetingLocationSerializer( required = False)
host = serializers.PrimaryKeyRelatedField(read_only=True)
members = serializers.ListField(child=serializers.EmailField())
class Meta:
model = Meeting
fields = ['id','title','description','date_time','time_zone','host','is_private','is_virtual','url','location','host','members']
extra_kwargs = {'location': {'required': False}}
这是 session models.py :
class Meeting(models.Model):
TIMEZONES = tuple(zip(pytz.all_timezones, pytz.all_timezones))
title = models.CharField(max_length=255)
description = models.TextField()
# Date Time Is in UTC
date_time = models.DateTimeField()
time_zone = models.CharField(max_length=32, choices=TIMEZONES,
default='UTC')
#TODO: Convert to REMOTE_USER, Temperory integer
host = models.ForeignKey(get_user_model(),on_delete=models.CASCADE)
is_private = models.BooleanField(default=True)
is_virtual = models.BooleanField(default=True)
url = models.CharField(blank=True,max_length=100)
deleted = models.BooleanField(default=False)
time_created = models.DateTimeField(auto_now_add=True)
和 Meetingmember models.py:
class MeetingMember(models.Model):
CHOICES = (
("A", "Accepted"),
("R", "Rejected"),
("I", "Invited" ),
("H", "Host"))
status = models.CharField(max_length=9, choices=CHOICES, default=None)
meeting = models.ForeignKey(Meeting, on_delete=models.CASCADE, related_name="members")
email = models.EmailField(blank=True)
member_uuid = models.UUIDField(default=uuid.uuid4, editable=False)
这是 create() :
def create(self, validated_data):
location_data = validated_data.pop('location')
members = validated_data.pop('members')
meeting = Meeting.objects.create( host=self.context['request'].user, **validated_data)
if location_data:
MeetingLocation.objects.create(meeting=meeting,**location_data)
if members :
for member in members:
if member == self.context['request'].user.email:
MeetingMember.objects.create(meeting=meeting, email = member, status="H")
else :
MeetingMember.objects.create(meeting=meeting, email = member, status="I")
return meeting
我发送了此 json, session 信息保存在 session 模型\中,邀请的电子邮件保存在 Meetingmember 模型中:
{
"location": {
"lat": "0.0000000000000003",
"lng": "0.0000000000000002"
},
"title": "bynas1006",
"description": "lets go removed2",
"date_time": "2021-06-30T06:14:00Z",
"time_zone": "Africa/Abidjan",
"is_private": true,
"is_virtual": true,
"url": "www.google.com",
"members":[
"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="432e26032e266d202c2e" rel="noreferrer noopener nofollow">[email protected]</a>",
"<a href="https://stackoverflow.com/cdn-cgi/l/email-protection" class="__cf_email__" data-cfemail="96f7f2fbfff8d6f7f2fbfff8b8f5f9fb" rel="noreferrer noopener nofollow">[email protected]</a>"
]
}
但我在终端中收到此错误:
Internal Server Error: /api/meetings/
Traceback (most recent call last):
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/django/core/handlers/exception.py", line 47, in inner
response = get_response(request)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/django/core/handlers/base.py", line 181, in _get_response
response = wrapped_callback(request, *callback_args, **callback_kwargs)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/django/views/decorators/csrf.py", line 54, in wrapped_view
return view_func(*args, **kwargs)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/viewsets.py", line 125, in view
return self.dispatch(request, *args, **kwargs)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/views.py", line 509, in dispatch
response = self.handle_exception(exc)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/views.py", line 469, in handle_exception
self.raise_uncaught_exception(exc)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/views.py", line 480, in raise_uncaught_exception
raise exc
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/views.py", line 506, in dispatch
response = handler(request, *args, **kwargs)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/mixins.py", line 20, in create
headers = self.get_success_headers(serializer.data)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/serializers.py", line 548, in data
ret = super().data
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/serializers.py", line 246, in data
self._data = self.to_representation(self.instance)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/serializers.py", line 515, in to_representation
ret[field.field_name] = field.to_representation(attribute)
File "/home/admin1/envs/myvenv/lib/python3.8/site-packages/rest_framework/fields.py", line 1661, in to_representation
return [self.child.to_representation(item) if item is not None else None for item in data]
TypeError: 'RelatedManager' object is not iterable
我不知道为什么会出现这个错误
最佳答案
该错误是由ListField 引起的。您可以通过替换来解决此问题
members = serializers.ListField(child=serializers.EmailField())
由
members = serializers.ListSerializer(child=serializers.EmailField())
免责声明:此答案只是一种解决方法。
很抱歉我无法解释这个问题,但我已经遇到了 ListField 无法理解的异常,所以我尽力避免它们。
关于python - 如何解决类型错误: RelatedManager object is not iterable,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/68728797/