第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號安全,請及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

DRF 使用嵌套序列化程序和外鍵創(chuàng)建對象

DRF 使用嵌套序列化程序和外鍵創(chuàng)建對象

慕田峪7331174 2022-12-20 09:49:47
我正在使用 DRF,我正在嘗試創(chuàng)建一個(gè)具有多個(gè)外鍵的對象以及需要在此過程中創(chuàng)建的相關(guān)對象。這是我的模型的簡化版本:class Race(models.Model):    name = models.CharField(max_length=200)    owner = models.ForeignKey(User, on_delete=models.CASCADE, related_name='races')    type = models.ForeignKey(Type, on_delete=models.SET_NULL, related_name='races', null=True)    region = models.ForeignKey(Region, on_delete=models.CASCADE, verbose_name=_('region'), related_name='races')    country = models.ForeignKey(Country, on_delete=models.CASCADE, related_name='races')    timezone = models.ForeignKey(Timezone, on_delete=models.SET_NULL, null=True)class Event(models.Model):    name = models.CharField(max_length=200)    race = models.ForeignKey(Race, on_delete=models.CASCADE, related_name='events')然后這是我的 Race 序列化程序:class RaceSerializer(serializers.ModelSerializer):    owner = UserSerializer(read_only=True)    type = TypeSerializer(read_only=True)    events = EventSerializer(many=True)    country = CountrySerializer()    region = RegionSerializer(read_only=True)    timezone = TimezoneSerializer(read_only=True)    def create(self, validated_data):        with transaction.atomic():            events = validated_data.pop('events', None)            race = Race(**validated_data)            race.save()            for event in events:                Event.objects.create(race=race, **event)        return race我的看法:class AddRaceView(CreateAPIView):    serializer_class = RaceSerializer    permission_classes = (IsAuthenticated,)    def perform_create(self, serializer):        serializer.save(owner=self.request.user)所以我遇到的問題是將有效數(shù)據(jù)傳遞給外鍵的序列化程序。我不想為Type、Region、Country、創(chuàng)建新對象Timezone,只傳遞適當(dāng)?shù)臄?shù)據(jù),以便新創(chuàng)建的 Race 對象正確引用現(xiàn)有的外鍵。這是我嘗試過的:1) 沒有read_only=True在外鍵序列化器上設(shè)置。這會(huì)嘗試創(chuàng)建我不想要的新對象。2)設(shè)置read_only=True外鍵序列化器(如上面的代碼)。這有助于不嘗試創(chuàng)建新Type的等對象,而是從序列化程序創(chuàng)建方法中Region刪除相應(yīng)的字段。validated_data所以我無法在創(chuàng)建時(shí)將現(xiàn)有對象添加到 Race 外鍵。3) 使用 PrimaryKeyForeignField 而不是TypeSerializer等RegionSerializer。但是當(dāng)我RaceSerializer用來檢索比賽數(shù)據(jù)時(shí),我只有一個(gè)pkundertype等region,我真的很想能夠檢索外鍵的所有字段。您能否建議正確的設(shè)置會(huì)尋找這樣的東西?我覺得它不應(yīng)該這么難。
查看完整描述

1 回答

?
MMMHUHU

TA貢獻(xiàn)1834條經(jīng)驗(yàn) 獲得超8個(gè)贊

所以最后我通過RelatedField為每個(gè)外鍵使用而不是單獨(dú)的序列化器解決了這個(gè)問題,除了嵌套EventSerializer的是真正需要編寫嵌套Event對象的。


這是RaceSerializer:


class RaceSerializer(serializers.ModelSerializer):

    owner = UserSerializer(read_only=True)

    type = TypeField()

    country = CountryField()

    region = RegionField()

    timezone = TimezoneField()

    events = EventSerializer(many=True)

    race_cal_types = serializers.SerializerMethodField()


    def create(self, validated_data):

        with transaction.atomic():

            events = validated_data.pop('events', None)

            race = Race(**validated_data)

            race.save()

            for event in events:

                Event.objects.create(race=race, **event)

        return race

這是我在我的每個(gè)字段中使用的組合RelatedField,例如外鍵:ModelSerializerRaceSerializerregion


class RegionSerializer(serializers.ModelSerializer):


    class Meta:

        model = Region

        fields = ('pk', 'name', 'code')



class RegionField(RelatedField):


    def get_queryset(self):

        return Region.objects.all()


    def to_internal_value(self, data):

        return self.get_queryset().get(**data)


    def to_representation(self, value):

        return RegionSerializer(value).data

每個(gè)字段 ( type, region, country, timezone) 都有自己的to_internal_value方法to_representation,可以按照我需要的方式序列化/反序列化數(shù)據(jù)。


查看完整回答
反對 回復(fù) 2022-12-20
  • 1 回答
  • 0 關(guān)注
  • 159 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號