gpt4 book ai didi

django - 使用 SlugRelatedField 创建和保存外键对象

转载 作者:行者123 更新时间:2023-12-03 02:33:28 26 4
gpt4 key购买 nike

我刚刚开始使用 Django REST 框架,但在保存外键时遇到问题。我有一个 Merchant 模型和一个 Phone 模型。 电话具有Merchant的外键。向 Merchant 发出 POST 请求时,我想为请求中提供的号码创建 Phone 对象。但是当我提供电话号码时,出现以下错误

Object with phone=0123456789 does not exist.

我只是希望它自己创建 Phone 对象。以下是我正在使用的模型:

class Merchant(models.Model):
merchant_id = models.CharField(max_length=255)
name = models.CharField(max_length=255)
is_active = models.BooleanField(default=True)

class Meta:
managed = True
db_table = 'merchant'

# Managers
objects = models.Manager()
active = managers.ActiveManager()

class Phone(models.Model):
phone = models.CharField(max_length=255)
merchant = models.ForeignKey('merchant.Merchant',
related_name='phones',
blank=True,
null=True)

class Meta:
managed = True
db_table = 'phone'

这是我正在使用它们的 View 和序列化器

class MerchantSerializer(serializers.ModelSerializer):
phones = serializers.SlugRelatedField(
many=True,
slug_field='phone',
queryset=primitives.Phone.objects.all())

class Meta:
model = Merchant
fields = (
'merchant_id',
'name',
'is_active',
'phones',
)

class MerchantViewSet(viewsets.ModelViewSet):
queryset = Merchant.active.all()
serializer_class = MerchantSerializer

这是我的请求正文:

{
"merchant_id": "emp011",
"name": "Abhinav",
"is_active": true,
"phones": [
"0123456789",
"9876543210"
]
}

这是回复:

400 错误请求

{"phones":["Object with phone=0123456789 does not exist."]}

最佳答案

The SlugRelatedField与许多相关领域一样,Django REST 框架提供的功能旨在与已存在的对象一起使用。由于您要引用已经存在的对象或需要创建的对象,因此您将无法按原样使用它。

您将需要一个自定义 SlugRelatedField,用于在对象不存在时创建新对象。

class CreatableSlugRelatedField(serializers.SlugRelatedField):

def to_internal_value(self, data):
try:
return self.get_queryset().get_or_create(**{self.slug_field: data})[0]
except ObjectDoesNotExist:
self.fail('does_not_exist', slug_name=self.slug_field, value=smart_text(data))
except (TypeError, ValueError):
self.fail('invalid')

class MerchantSerializer(serializers.ModelSerializer):
phones = CreatableSlugRelatedField(
many=True,
slug_field='phone',
queryset=primitives.Phone.objects.all()
)

class Meta:
model = Merchant
fields = (
'merchant_id',
'name',
'is_active',
'phones',
)

切换到get_or_create ,如果电话号码对象尚不存在,则将创建该对象。如果需要在模型上创建其他字段,您可能需要对此进行调整。

关于django - 使用 SlugRelatedField 创建和保存外键对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28009829/

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