【问题标题】:Django Rest framework how to create Family and assign members to that family while assigning roles to each memberDjango Rest框架如何创建家庭并将成员分配给该家庭,同时为每个成员分配角色
【发布时间】:2021-08-03 14:08:25
【问题描述】:

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

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

所以我试图在我的Family Serializer 中实现这一点。

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

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

正如您在上面看到的,我可以清楚地为该家庭分配成员。

但我也想为每个家庭成员分配角色。 我怎样才能在 Django 中做到这一点?

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

我的前端将与我的Create Family page 中的类似(并且我希望通过使用api/family/ 端点仅向服务器发送一个请求来实现此目的)

我只是想,

创建一个家庭,

将成员(教区居民)分配给该家庭,

为每个成员(教区居民)分配角色,

通过api/family/端点。

实现上述目标的最佳方法是什么?

【问题讨论】:

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


【解决方案1】:

您可以使用函数create 在序列化程序中完成所有这些操作(更新也是如此,但您在这里谈论的是创建)。

class FamilySerializer(serializers.ModelSerializer):
    # No need to define members here as it is the related name
    # and that it will popped out
    class Meta:
        model = Family
        fields = ('id', 'name', 'address', 'monthly_contribution', 'members', 'enabled')
        read_only_fields = ('id',)

    def create(self, validated_data):
        members = None
        if 'members' in validated_data.keys():
            members = validated_data.pop('members')

        # Create the family
        family = Family.objects.create(**validated_data)

        # Deal with members data
        if members is not None:
            for member_data in members:
                role_id = member_data.get('role', None)
                if role_id is not None:
                    role = Role.objects.get(id=role_id)
                    Parishioner.objects.create(
                        family=family,
                        role=role
                    )
        return family

家庭被创建并返回,成员也被创建为通讯员角色。 在前面,它会这样:

        axios.post('api/family/', {
            family_name: 'Smith',
            members: [
                {
                    role: '3' # Father id for example
                },
                {
                    role: '2', # Mother id
                }
            ]
        })

您当然可以更改角色并根据需要使用名称。只是注意字段之间要连贯,以识别前后角色Role.objects.get(field=value)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-10-02
    • 2012-03-16
    • 2013-04-01
    • 1970-01-01
    • 2017-01-25
    • 2021-11-18
    • 2020-06-17
    相关资源
    最近更新 更多