Сериализация отношения «многие ко многим» с промежуточной моделью в Django Rest - PullRequest
1 голос
/ 02 февраля 2020

Я пытался проверить другие темы, но не нашел решения ...

У меня есть модель "многие ко многим", у которой есть промежуточная модель с другим полем additional_field внутри.

class BoardField(models.Model):
    title = models.CharField(max_length=500, default='')

class Article(models.Model):
    title = models.CharField(max_length=500, default='')
    fields = models.ManyToManyField(BoardField, through='ArticleField', through_fields=('article', 'board_field'))

class ArticleField(models.Model):
    article = models.ForeignKey(Article, on_delete=models.CASCADE, related_name='task')
    board_field = models.ForeignKey(BoardField, on_delete=models.CASCADE)

    additional_field = models.CharField(max_length=200, blank=True, null=True)

Я хочу сериализовать Article со структурой:

[
    "title":"Title",
    "fields":[
        {
            "board_field": {
                "title":"Title"
            },
            "additional_field":"Additional info"
        }
    ]
]

Итак, я написал сериализатор:

class BoardFieldSrl(serializers.ModelSerializer):

    class Meta:
        model = BoardField
        fields = (
            'title',
        )

class ArticleFieldSrl(serializers.ModelSerializer):

    board_field = BoardFieldSrl()

    class Meta:
        model = ArticleField
        fields = (
            'board_field',
            'additional_field',
        )

class ArticleListSrl(serializers.ModelSerializer):

    fields = ArticleFieldSrl(many=True)

    class Meta:
        model = Article
        fields = (
            'title',
            'fields',
        )

Но я всегда получал ошибку:

Got AttributeError when attempting to get a value for field `board_field` on serializer `ArticleFieldSrl`.
The serializer field might be named incorrectly and not match any attribute or key on the `BoardField` instance.
Original exception text was: 'BoardField' object has no attribute 'board_field'.

Я сделал еще несколько примеров, но они не дали мой результат, который мне нужен ... Мой максимум - я получил BoardField с уровнями, но без промежуточной модели ...

Можете ли вы помочь мне с сериализатором, той структурой возврата, о которой я упоминал выше? Он должен включать промежуточную модель ArticleField и вложенную BoardField.

1 Ответ

1 голос
/ 03 февраля 2020

Попробуйте fields = ArticleFieldSrl(source='articlefield_set', many=True)

Вы не указали related_name в поле M2M, поэтому применяется именование по умолчанию, равное 'Intermediate model name'_set, и если вы хотите использовать поля в отношении M2M, вам необходимо сообщите сериализатору, где искать.

РЕДАКТИРОВАТЬ: верблюд удален из articlefield_set, название модели всегда преобразуется в нижний регистр

...