gpt4 book ai didi

python-3.x - Django多对一关系将数据添加到多方

转载 作者:行者123 更新时间:2023-12-04 08:00:08 25 4
gpt4 key购买 nike

我有两个像下面这样的模型。我正在使用 Django restframework。

class Family(models.Model):
name= models.CharField(max_length=100)

class Parishioner(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
family = models.ForeignKey(Family, on_delete=models.CASCADE)
有我的 View 集
class FamilyViewSet(viewsets.ModelViewSet):
queryset = Family.objects.all()
serializer_class = FamilySerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)

class ParishionerViewSet(viewsets.ModelViewSet):
queryset = Parishioner.objects.all()
serializer_class = serializers.ParishionerSerializer
authentication_classes = (TokenAuthentication,)
permission_classes = (IsAuthenticated,)
这些是我的序列化程序
class FamilySerializer(serializers.ModelSerializer):

class Meta:
model = Family
fields = ('id', 'name')
read_only_fields = ('id',)


class ParishionerSerializer(serializers.ModelSerializer):
class Meta:
model = Parishioner
fields = ('id', 'first_name', 'last_name', 'family')
read_only_fields = ('id',)
depth = 1
所以基本上 Parishioner可以有一个 Family . Family有多个 members(Parishioners)目前我必须去所有 Parishioners并选择 Family .
是否可以添加一个名为 members 的字段?至 Family模型,其中成员是 ArrayExisting Parishioners ?
或者有没有其他方法可以解决这个问题?
enter image description here

最佳答案

在数据库端这样做是个坏主意,因为这意味着数据库不再检查它。
但是您可以在序列化程序中轻松执行此操作。我们通过添加 ParishionerSerializer 的实例来做到这一点。到 FamilySerializer .我们需要定义 ParishionerSerializer之前FamilySerializer ,否则,该标识符尚未分配:

class ParishionerSerializer(serializers.ModelSerializer):
class Meta:
model = Parishioner
fields = ('id', 'first_name', 'last_name', 'family')
read_only_fields = ('id',)
depth = 1


class FamilySerializer(serializers.ModelSerializer):
parishioner_set = ParishionerSerializer(many=True, read_only=True)

class Meta:
model = Family
fields = ('id', 'name')
read_only_fields = ('id',)
您可以将其重命名为 members在模型层,然后相应地更新序列化器,或仅在子序列化器中。
选项 1:使用 related_name=…我们可以将关系重命名为 memebers通过为 related_name=… [Django-doc] 指定一个值:
class Parishioner(models.Model):
first_name = models.CharField(max_length=30)
last_name = models.CharField(max_length=30)
family = models.ForeignKey(
Family,
on_delete=models.CASCADE,
related_name='members'
)
那么序列化器因此使用 member反而:
class FamilySerializer(serializers.ModelSerializer):
members = ParishionerSerializer(many=True, read_only=True)

class Meta:
model = Family
fields = ('id', 'name')
read_only_fields = ('id',)
选项 2:使用 source=… 重命名序列化程序
我们也只能在序列化器级别指定它,通过指定 source=… parameter [drf-doc] :
class FamilySerializer(serializers.ModelSerializer):
members = ParishionerSerializer(
source='parishioner_set',
many=True,
read_only=True
)

class Meta:
model = Family
fields = ('id', 'name')
read_only_fields = ('id',)

关于python-3.x - Django多对一关系将数据添加到多方,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/66514374/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com