Django REST Framework поле было объявлено на сериализаторе, но не включено - PullRequest
0 голосов
/ 15 марта 2020

Если я включу board_field в определение UserSerializer, я получу:

AttributeError: у объекта 'User' нет атрибута 'board_field'

if Я исключаю это, я получаю:

поле было объявлено на сериализаторе, но не включено

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

Прежде всего, у меня есть эта структура проекта.

foo_project
    - foo_project
         - __init__.py
         - asgi.py
         - settings.py
         - urls.py
         - wsgi.py
    - apps
       - board
           - __init__.py
           - admin.py
           - apps.py
           - models.py
           - serializers.py
           - tests.py
           - urls.py
           - views.py
       - accounts
           - __init__.py
           - admin.py
           - apps.py
           - models.py
           - serializers.py
           - tests.py
           - urls.py
           - views.py

Плата,

# models.py
class Board(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='user')
    title = models.CharField(blank=False, max_length=255)
    body = models.TextField(blank=False)
    image = models.ImageField(upload_to='time_line_photo')
    created = models.DateTimeField(auto_now_add=True)
    updated = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.title

    def get_absolute_url(self):
        return reverse('article_detail', args=[str(self.id)])

    class Meta:
        ordering = ['-created']

# serializers.py
from rest_framework import serializers
from .models import Board
from django.contrib.auth.models import User

class BoardSerializer(serializers.ModelSerializer):

    class Meta:
        model = Board
        fields = ('id', 'author', 'title', 'body', 'image', 'created','updated')

# views.py
from django.contrib.auth.models import User
from django.shortcuts import render

from rest_framework import generics

from .models import Board
from .serializers import BoardSerializer

class BoardList(generics.ListCreateAPIView):
    queryset = Board.objects.all()
    serializer_class = BoardSerializer

class BoardDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Board.objects.all()
    serializer_class = BoardSerialize

Accounts,

# serializers.py
from rest_framework import serializers
from django.contrib.auth.models import User

from ..board.models import Board

class UserSerializer(serializers.ModelSerializer):
    board_field = serializers.PrimaryKeyRelatedField(
        many=True, queryset=Board.objects.all()
    )

    class Meta:
        model = User
        fields = ('id', 'username', 'board_field') 
# If I include board_field, I get AttributeError: 'User' object has no attribute 'board_field'
# I understand that I am using default django User model, but it is foreign key in Board model.

# views.py
from django.contrib.auth.models import User
from django.shortcuts import render
from rest_framework import generics

from .serializers import UserSerializer

class UserList(generics.ListAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerializer

class UserDetail(generics.RetrieveAPIView):
    queryset = User.objects.all()
    serializer_class = UserSerialize

Как я заявляю в комментарии, я думаю, что это моя проблема. Как UserSerializer может соединиться с Board? Я использую, Python = 3.7.4 Джанго = 3.0.4 djangorestframework = 3.11.0 Заранее спасибо!

1 Ответ

1 голос
/ 15 марта 2020

Пожалуйста, проверьте документацию обратные отношения . Модель User не имеет поля с именем board_field, и поэтому вы видите эту ошибку.

Я вижу, что вы уже использовали related_name='user' в модели Board. Но обратите внимание, что связанное имя используется для обратных отношений, например, в этом случае оно должно быть с точки зрения автора. Вы можете назвать его boards вместо user.

class Board(models.Model):
    author = models.ForeignKey(User, on_delete=models.CASCADE, related_name='boards')

Поскольку связанное имя установлено, вы можете использовать его в UserSerializer:

boards = serializers.PrimaryKeyRelatedField(
    many=True, queryset=Board.objects.all()
)

# also don't forget to include that in list of fields
...