【问题标题】:Django REST Framework relationship serializationDjango REST Framework 关系序列化
【发布时间】:2015-12-13 03:14:13
【问题描述】:

我一直在努力解决这个问题,并且知道我必须遗漏一些简单的东西。

我正在尝试学习 Django REST 框架,但在将 JSON 发布到服务器时遇到了将新对象的外键设置为现有其他对象的问题。

models.py

class Genre(models.Model):
    name = models.CharField(max_length=200)

class Author(models.Model):
    first_name = models.CharField(max_length=200)
    last_name = models.CharField(max_length=200)

    def full_name(self):
        return self.first_name + ' ' + self.last_name

class Book(models.Model):
    title = models.CharField(max_length=200)
    genre = models.ForeignKey(Genre)
    isbn = models.CharField(max_length=15, default='')
    summary = models.CharField(max_length=500, null=True)
    author = models.ForeignKey(Author)

serializers.py

class AuthorSerializer(serializers.ModelSerializer):
    class Meta:
        model = Author
        fields = ('id', 'first_name', 'last_name',)


class GenreSerializer(serializers.ModelSerializer):
    class Meta:
        model = Genre
        fields = ('id', 'name',)


class BookSerializer(serializers.ModelSerializer):
    author = AuthorSerializer(read_only=True)
    genre = GenreSerializer(read_only=True)

    class Meta:
        model = Book
        fields = ('id','url', 'author', 'genre', 'title', 'isbn', 'summary',)

我正在尝试创建一本与现有 AuthorGenre 相关的新书。所以,给定一些 JSON 之类的

{"title": "Title", 
 "author": {"id":1}
 "genre" : {"id":2}
 ...
}

我想创建一本新书并将其GenreAuthor 设置为数据库中已有的相应实体。

我尝试将BookSerializer 上的authorgenre 字段更改为serializers.PrimaryKeyRelatedField(),并搜索了文档和SO 以寻找答案,包括this one。我尝试将 JSON 中的字段更改为 "author": 1"genre_id": 2,但我似乎无法让它工作。我不断收到django.db.utils.IntegrityError: books_book.genre_id may not be NULL

如果有影响,我将使用 DRF ModelViewSet 获取视图。

我在这里错过了什么?

【问题讨论】:

    标签: python django django-rest-framework


    【解决方案1】:

    您收到 Integrity 错误,因为它需要 author instance,但您发送的是与作者相关的 pk。试试这个

    serializers.py

    class BookSerializer(serializers.ModelSerializer):
        author = AuthorSerializer(read_only=True)
        genre = GenreSerializer(read_only=True)
    
        class Meta:
            model = Book
            fields = ('id','url', 'author', 'genre', 'title', 'isbn', 'summary',)
    
        def create(self, validated_data):
            author_id = self.initial_data.pop("author")
            genre_id = self.initial_data.pop("genre")
            author = Author.objects.get(id=author_id)
            genre = Genre.objects.get(id=genre_id)
            book = Book.objects.create(author=author, genre=genre, **validated_data)
            return book
    

    【讨论】:

      猜你喜欢
      • 2016-12-18
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-05
      • 2021-06-12
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多