【问题标题】:Django Serializer from ManyToManyField using through来自 ManyToManyField 的 Django Serializer 使用 through
【发布时间】:2021-11-13 17:53:55
【问题描述】:

我正在尝试从 Django 序列化 User 模型,包括我创建的 manyToMany 关系。

这是我的模型:

class CompanyAccount(models.Model):
   id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
   user_ids = models.ManyToManyField(User, through='CompanyUser')

class CompanyUser(models.Model):
   id = models.UUIDField(default=uuid.uuid4, unique=True, primary_key=True, editable=False)
   user_id = models.ForeignKey(User, on_delete=models.CASCADE)
   company_id = models.ForeignKey(CompanyAccount, on_delete=models.CASCADE)
   is_company_admin = models.BooleanField(default=False, null=True)

现在我的目标是让公司序列化并与任何用户一起返回。

这是我的序列化程序,但遗憾的是公司没有归还。

class CompanyAccountSerializer(serializers.ModelSerializer):
    address_id = AddressSerializer(many=False)

    class Meta:
        model = CompanyAccount
        fields = '__all__'

class UserSerializer(serializers.ModelSerializer):
    company_id = CompanyAccountSerializer(many=False, read_only=True)

    class Meta:
        model = User
        fields = ['id', 'username', 'email', 'first_name', 'last_name', 'company_id']

欢迎任何帮助:-)

【问题讨论】:

    标签: django django-models django-rest-framework django-serializer


    【解决方案1】:

    ManyToManyField 的默认相关名称是<i>modelname</i>_set,因此您可以使用以下方式实现:

    class UserSerializer(serializers.ModelSerializer):
        companyaccount_set = CompanyAccountSerializer(many=True, read_only=True)
    
        class Meta:
            model = User
            fields = ['id', 'username', 'email', 'first_name', 'last_name', 'companyaccount_set']

    如果要重命名字段,可以使用:

    class UserSerializer(serializers.ModelSerializer):
        accounts = CompanyAccountSerializer(many=True, read_only=True, source='companyaccount_set')
    
        class Meta:
            model = User
            fields = ['id', 'username', 'email', 'first_name', 'last_name', 'accounts']

    【讨论】:

    • 我现在收到以下错误:原始异常文本为:“ManyRelatedManager”对象没有属性“address_id”
    • @PierreAnken:在您的CompanyAccountSerializer 中,您指定address_idmany=False,但显然这是一对多的关系。
    • address_id = models.ForeignKey(Address, on_delete=models.PROTECT) 经过测试,我无法返回任何没有错误的关系字段,并且从模型中获取基本字段时不会返回任何内容。
    • @PierreAnken: 等一下,你应该使用many=True 作为CompanyAccountSerializer,因为它是ManyToManyField..
    • 非常感谢解决了它:-)
    猜你喜欢
    • 2020-08-09
    • 2023-03-05
    • 2012-02-08
    • 1970-01-01
    • 2018-07-14
    • 2013-10-11
    • 2019-03-07
    • 2019-07-13
    • 2013-08-03
    相关资源
    最近更新 更多