在 Django 中处理来自多个模型的多个外键

时间:2021-05-12 13:44:28

标签: python python-3.x django django-models django-rest-framework

我的教区居民模型如下(仅粘贴相关代码)

class Parishioner(models.Model):
    family = models.ForeignKey(Family, null=True, on_delete=models.PROTECT, related_name='members')
    role = models.ForeignKey(FamilyRole, null=True, blank=True, on_delete=models.PROTECT, related_name='role')

教区居民可以在该家庭中拥有one FamilyOne role

所以我试图在我的家庭序列化器中实现这一点。

class FamilySerializer(serializers.ModelSerializer):
    members = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=Parishioner.objects.all(),
        allow_null=True,
        required=False
    )

    role = serializers.PrimaryKeyRelatedField(
        many=True,
        queryset=FamilyRole.objects.all(),
        allow_null=True,
        required=False
    )

    class Meta:
        model = Family
        fields = ('id', 'name', 'address', 'monthly_contribution', 'members', 'role', 'enabled')
        read_only_fields = ('id',)
        depth = 1

基本上我想要做的是当我添加家庭时,我可以向该家庭添加成员(教区居民)并为每个成员分配一个角色。

我在这里做错了什么? 因为当我加载我的 api/family/

我遇到以下错误

'Family' object has no attribute 'role'

但是您可以清楚地看到我在教区居民模型中添加了 related_name='role'

那么我怎样才能实现我想要的?

我想将成员(教区居民)添加到家庭并为该家庭中的每个成员分配角色。

FamilyRole 的示例:父亲、母亲、儿子、女儿

我的前端将与我的“创建家庭”页面中的类似(并且我希望通过使用 api/family/ 端点仅向服务器发送一个请求以实现此目的)

enter image description here

2 个答案:

答案 0 :(得分:0)

您是否尝试删除 depth 或将其设置为 2?您的序列化程序中显然有一个字段 role,我的猜测是 Django 无法识别它,因为 depth 选项。

那你会问我为什么要识别字段members?不是,这并没有引发错误,因为您的 family 模型中有一个 related_name Parishoner

答案 1 :(得分:0)

您的帖子中有几个问题。

class Parishioner(models.Model):
    family = models.ForeignKey(Family, null=True, on_delete=models.PROTECT, related_name='members')
    role = models.ForeignKey(FamilyRole, null=True, blank=True, on_delete=models.PROTECT, related_name='role')

所以 Partishioner 有一个 role 列。

class FamilySerializer(serializers.ModelSerializer):
    class Meta:
        model = Family
        fields = ('id', 'name', 'address', 'monthly_contribution', 'members', 'role', 'enabled')

在序列化程序中,您尝试访问 roleFamily

'Family' object has no attribute 'role'

我猜您的 Family 模型没有 role 列,但 Parishioner 有。