gpt4 book ai didi

django - 如何在不从嵌套序列化器创建模型的情况下通过序列化器创建模型实例?

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

我有很多链接的模型:

class Travel(BaseAbstractModel):

tags = models.ManyToManyField(
Tag,
related_name='travels',
)
owner = models.ForeignKey(
'users.TravelUser',
related_name='travel_owner'
)
payment = models.ForeignKey(
Payment,
related_name='travels',
)
country = models.ForeignKey(
Country,
related_name='travels,
)
........

许多这些模型只有两个具有唯一名称和图像的字段。
我为这些模型中的每一个创建序列化程序并将它们放入 TravelSerializer
class TravelBaseSerializer(DynamicFieldsModelSerializer):

owner = UserSerializer(required=False)
tags = TagSerializer(many=True)
payment = PaymentSerializer()
country = CountrySerializer()

基于文档我覆盖 create()update .
问题是,当我发送 JSON 数据时,Django 从嵌套的序列化程序创建每个模型。但我只想创建 Travel实例。此外,我不仅要接收和响应序列化对象 pk field 。

更新
我解决了这个问题,把代码放在答案中。现在我可以在不创建对象的情况下接收和响应序列化程序数据。
但我认为 DRF 提供了比我更优雅的方法。这是我使用 DRF 的第一个项目,也许我错过了一些东西,但有一个更简单的解决方案。

最佳答案

我决定覆盖 to_internal_value()将其放入自定义 serailizer 并从中继承所有嵌套的序列化程序:

class NestedRelatedSerializer(serializers.ModelSerializer):

def to_internal_value(self, data):
try:
pk = data['pk']
except (TypeError, KeyError):
# parse pk from request JSON
raise serializers.ValidationError({'_error': 'object must provide pk!'})
return pk

获取所有 pk从它并保存在 createupdated方法:
    def update(self, instance, validated_data):
# If don't get instance from db, m2m field won't update immediately
# I don't understand why
instance = Travel.objects.get(pk=instance.pk)
instance.payment_id = validated_data.get('payment', instance.payment_id)
instance.country_id = validated_data.get('country', instance.country_id)
# update m2m links
instance.tags.clear()
instance.tags.add(*validated_data.get('tags'))
instance.save()
return instance

关于django - 如何在不从嵌套序列化器创建模型的情况下通过序列化器创建模型实例?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38456194/

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