Django rest framework Django rest框架在外键不存在时使用序列化程序创建新记录';不存在
假设我有这两个模型:Django rest framework Django rest框架在外键不存在时使用序列化程序创建新记录';不存在,django-rest-framework,Django Rest Framework,假设我有这两个模型: class App(models.Model): label = models.CharField(max_length=32) class Endpoint(models.Model): main_app = models.ForeignKeyField(App, on_delete=models.CASCADE) ... class EndpointSerializer(serializers.HyperlinkedModelSerializer): mai
class App(models.Model):
label = models.CharField(max_length=32)
class Endpoint(models.Model):
main_app = models.ForeignKeyField(App, on_delete=models.CASCADE)
...
class EndpointSerializer(serializers.HyperlinkedModelSerializer):
main_app = serializers.SlugRelatedField(queryset=App.objects.all(), slug_field='label')
class Meta:
model = ReviewComponent
fields = [
'id',
'main_app'
]
当我想用现有的应用程序创建一个新的端点时,它非常简单:
serializer = EndpointSerializer(data={'main_app': 'foo'...})
serializer.is_valid()
serializer.save()
但是当我想用一个不存在的应用程序创建一个新的端点时,这种方法不起作用,正确的方法是什么
我总是可以为应用程序添加序列化程序,通过AppSerializer创建应用程序,然后在EndpointSerializer上继续创建,但我不相信这是正确的方法 在Django rest框架文档中有这样一个例子: 在Django rest框架中,为应用程序模型使用序列化程序似乎是管理应用程序对象创建的一种相当常见的方法。根据您的问题中的模型对其进行调整可能如下所示:
from django.db import models
from rest_framework import serializers
class App(models.Model):
label = models.CharField(max_length=32)
class Endpoint(models.Model):
main_app = models.ForeignKey(App, on_delete=models.CASCADE)
class AppSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = App
fields = '__all__'
class EndpointSerializer(serializers.HyperlinkedModelSerializer):
main_app = AppSerializer()
class Meta:
model = Endpoint
fields = '__all__'
def create(self, validated_data):
main_app_data = validated_data.pop('main_app')
main_app = App.objects.get_or_create(**main_app_data)
validated_data['main_app'] = main_app
return super().create(validated_data)
----------------------------------------------------
>>> from qqq.models import App, Endpoint, AppSerializer, EndpointSerializer
>>> serializer = EndpointSerializer(data={'main_app': {'label': 'label-1'}}) # notice the nested dict here
>>> serializer.is_valid()
True
>>> serializer.save()
<Endpoint: Endpoint object (1)>
>>> App.objects.all()
<QuerySet [<App: App object (1)>]>
>>> Endpoint.objects.all()
<QuerySet [<Endpoint: Endpoint object (1)>]>
来自django.db导入模型的
从rest_框架导入序列化程序
类应用程序(models.Model):
label=models.CharField(最大长度=32)
类终结点(models.Model):
main\u app=models.ForeignKey(app,on\u delete=models.CASCADE)
类AppSerializer(serializers.HyperlinkedModelSerializer):
类元:
模型=应用程序
字段='\uuuu所有\uuuu'
类EndpointSerializer(serializers.HyperlinkedModelSerializer):
main_app=AppSerializer()
类元:
模型=端点
字段='\uuuu所有\uuuu'
def创建(自我验证的_数据):
main\u app\u data=validated\u data.pop('main\u app')
main\u app=app.objects.get\u或创建(**main\u app\u数据)
已验证的_数据['main_app']=main_app
return super().create(已验证的_数据)
----------------------------------------------------
>>>从qqq.models导入应用程序、端点、AppSerializer、EndpointSerializer
>>>serializer=EndpointSerializer(data={'main_app':{'label':'label-1'}})#注意这里的嵌套dict
>>>序列化程序。_是否有效()
真的
>>>serializer.save()
>>>App.objects.all()