2015-09-16 5 views
0

Я ударил головой об этой проблеме и знаю, что мне нужно пропустить что-то простое.Сегментация отношений структуры Django REST

Я пытаюсь изучить Django REST Framework и проблемы с настройкой внешних ключей нового объекта на существующие другие объекты при отправке 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',) 

То, что я пытаюсь это создать новую книгу, связанную с существующейAuthor и Genre. Таким образом, учитывая некоторые JSON как

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

Я хочу, чтобы создать новую книгу и иметь Genre и Author набор для соответствующих субъектов, которые уже находятся в базе данных.

Я попытался изменить author и genre поля на BookSerializer в serializers.PrimaryKeyRelatedField() и мытой документы и поэтому для ответов, в том числе this one. Я попытался изменить поля в JSON на "author": 1 или "genre_id": 2, но я не могу заставить его работать. Я продолжаю получать django.db.utils.IntegrityError: books_book.genre_id may not be NULL.

Я использую DRF ModelViewSet для просмотра, если это имеет значение.

Что мне здесь не хватает?

ответ

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 
Смежные вопросы