Abh*_*sor 14 django django-rest-framework
我刚开始使用Django REST框架而且我在保存外键时遇到了麻烦.我有一个Merchant
模型和一个Phone
模型.该Phone
有一个外键Merchant
.在发出POST
请求时Merchant
,我想为Phone
请求中提供的数字创建对象.但是当我提供电话号码时,它会给我以下错误
电话= 0123456789的对象不存在.
我只是想让它自己创建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'
Run Code Online (Sandbox Code Playgroud)
这是我正在使用它们的视图和序列化器
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
Run Code Online (Sandbox Code Playgroud)
这是我的请求主体的样子:
{
"merchant_id": "emp011",
"name": "Abhinav",
"is_active": true,
"phones": [
"0123456789",
"9876543210"
]
}
Run Code Online (Sandbox Code Playgroud)
这是回复:
400错误请求
{"phones":["Object with phone=0123456789 does not exist."]}
Run Code Online (Sandbox Code Playgroud)
Kev*_*own 30
该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 = CreateableSlugRelatedField(
many=True,
slug_field='phone',
queryset=primitives.Phone.objects.all()
)
class Meta:
model = Merchant
fields = (
'merchant_id',
'name',
'is_active',
'phones',
)
Run Code Online (Sandbox Code Playgroud)
通过切换到get_or_create
,将创建电话号码对象(如果尚不存在).如果必须在模型上创建其他字段,则可能需要调整此项.
归档时间: |
|
查看次数: |
4452 次 |
最近记录: |