Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/api/5.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 具有3个外键的嵌套序列化程序。如何实现GET和POST?_Django_Api_Serialization_Django Rest Framework - Fatal编程技术网

Django 具有3个外键的嵌套序列化程序。如何实现GET和POST?

Django 具有3个外键的嵌套序列化程序。如何实现GET和POST?,django,api,serialization,django-rest-framework,Django,Api,Serialization,Django Rest Framework,// // // 有人能帮我吗?当我有一个GET方法时,我如何序列化一本带有3个外键的书并显示所有细节?(所有细节=书籍细节+书籍制造商+编辑+作者) 还有POST方法,如果我想创建一本包含所有信息的书,它将如何实现 PS:在实际应用中,我有一个带有3个外键的模型,就像示例一样。我在这里使用了一个简单的示例,它不是我真正的模型字段和类名XD,只是一个示例。您可以这样定义序列化程序: 但对于创建一本新书,您可以在BookSerializer中定义create方法,并在其中创建所有新的obj cla

//

//

//

有人能帮我吗?当我有一个GET方法时,我如何序列化一本带有3个外键的书并显示所有细节?(所有细节=书籍细节+书籍制造商+编辑+作者)

还有POST方法,如果我想创建一本包含所有信息的书,它将如何实现


PS:在实际应用中,我有一个带有3个外键的模型,就像示例一样。我在这里使用了一个简单的示例,它不是我真正的模型字段和类名XD,只是一个示例。

您可以这样定义序列化程序:

但对于创建一本新书,您可以在BookSerializer中定义create方法,并在其中创建所有新的obj

class Book(models.Model):

   author = models.models.ForeignKey(Author, on_delete=models.CASCADE)

   editor = models.models.ForeignKey(Editor, on_delete=models.CASCADE)

   book_manufacturer = models.models.ForeignKey(Book_Manufacturer, on_delete=models.CASCADE)

   title = models.CharField(max_length=255)

   year = models.DateTime(default=datetime.now)

您可以这样定义序列化程序:

但对于创建一本新书,您可以在BookSerializer中定义create方法,并在其中创建所有新的obj

class Book(models.Model):

   author = models.models.ForeignKey(Author, on_delete=models.CASCADE)

   editor = models.models.ForeignKey(Editor, on_delete=models.CASCADE)

   book_manufacturer = models.models.ForeignKey(Book_Manufacturer, on_delete=models.CASCADE)

   title = models.CharField(max_length=255)

   year = models.DateTime(default=datetime.now)

在我正在创建一本书的时候,通过这个实现,我可以选择使用数据库中的作者,或者要求我创建一个新作者?例如,它创建一个新作者。但是如果你想从db中获得作者列表,你应该使用另一种方法。我现在要写的是,在应用程序中,我需要使用db中的作者列表。在我正在创建一本书的时候,有了这个实现,它会让我选择使用数据库中的作者,或者让我创建一个新作者?例如,它会创建一个新作者。但是如果你想从db中获得作者列表,你应该使用另一种方法。我现在就要写。是的,在应用程序中,我需要使用db中的作者列表。对于视图,请使用泛型。CreateAPIViewMy其他视图都是视图集,如果我使用视图集,会有任何问题吗?我不习惯使用视图集,总是使用泛型或纯APIView。但是你可以测试它。对于视图,请使用泛型。CreateAPIViewMy其他视图都是视图集,如果我使用视图集,会有任何问题吗?我不习惯使用视图集,总是使用泛型或纯APIView。但是你可以测试它。
class Book_Manufacturer(models.Model):

   name = models.CharField(max_length=255)

   year_production = models.DateTimeField(default=datetime.now)
class Book(models.Model):

   author = models.models.ForeignKey(Author, on_delete=models.CASCADE)

   editor = models.models.ForeignKey(Editor, on_delete=models.CASCADE)

   book_manufacturer = models.models.ForeignKey(Book_Manufacturer, on_delete=models.CASCADE)

   title = models.CharField(max_length=255)

   year = models.DateTime(default=datetime.now)
class AuthorSerializer(ModelSerializer):
    class Meta:
        model = Author
        fields = ('first_name', 'last_name', 'age')

class EditorSerializer(ModelSerializer):
    class Meta:
        model = Editor
        fields = ('first_name', 'date_edition', 'status')

class Book_ManufacturerSerializer(ModelSerializer):
    class Meta:
        model = Book_Manufacturer
        fields = ('name', 'year_production')


class BookSerializer(ModelSerializer):

    author = AuthorSerializer()
    editor = EditorSerializer()
    book_manufacturer = Book_ManufacturerSerializer()

    class Meta:
        model = Book
        fields = ('author', 'editor', 'book_manufacturer', 'title', 'year')
   def create(self, validated_data):
       author = validated_data.pop('author')
       editor = validated_data.pop('editor')
       book_manufacturer = validated_data.pop('book_manufacturer')

       author_obj = Author.objects.create(first_name=author['first_name'], last_name=author['last_name'])

       # do it for editor and book_manufacturer
       book = Book.objects.create(author=author_obj, editor=editor_obj, book_manufacturer=book_manufacturer_obj, title=validated_data['title'], year=validated_data['year'])

       return validated_data
class BookSimpleSerializer(ModelSerializer):
    class Meta:
        model = Book
        fields = ('author', 'editor', 'book_manufacturer', 'title', 'year')

    def create(self, validated_data):
        return Book(**validated_data)