Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/318.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Django rest framework Django rest框架在外键不存在时使用序列化程序创建新记录';不存在_Django Rest Framework - Fatal编程技术网

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()