python - 如何解决类型错误: RelatedManager object is not iterable

标签 python json django django-rest-framework

我必须建立模型(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/

相关文章:

ios - 无法将数据转换为字符周围的字符串

php - 访问多个 JSON

django - Django OpencensusMiddleware 中的 App Insights 问题 '_is_coroutine'

python - 如何删除多层括号python中的文本

python - Pandas 数据框查询

python - optional 参数 Python

python - 将 Psyco 与 Django 一起使用是否有意义?

python - 将 Django 1.5.4 连接到 Mamp MySQL - 无法连接到本地服务器

jquery - 如何将 JSON 字符串或 JSON 对象与 jqGrid 一起使用?

django - 在 django 中安装 pandas