Django Дженерики Rest Framework CreateAPIView - как просто включить внешний ключ, не создавая его - PullRequest
0 голосов
/ 03 августа 2020

Я пытаюсь создать generics.CreateAPIView в соответствии с документацией DRF.

У меня есть это (я могу включить свой PageSerializer, если это будет полезно:

class PageCreateView(generics.CreateAPIView):
    queryset = Page.objects.all()
    serializer_class = PageSerializer

Вот моя модель:

class Page(models.Model):
    date = models.DateField("Post date")
    intro = models.CharField(max_length=600)
    title = models.CharField(max_length=255)
    chinese = models.TextField(blank=True)
    english = models.TextField(blank=True)
    json = JSONField(default=dict, null=True, blank=True)
    category = models.ForeignKey(
        Category, on_delete=models.CASCADE)
    calculated_hsk = models.DecimalField(
        default=1, max_digits=3, decimal_places=2)
    translated = models.BooleanField(default=False)

Я пытаюсь использовать конечную точку POST, однако, когда у меня есть такой запрос POST:

    {
        "translated": true,
        "category": 1,
        "title": "Test POST title",
        "english": "Test English Text",
        "chinese": "我是一个兵",
        "intro": "test intro",
        "date": "2020-08-02",
        "calculated_hsk": 3.5,
        "json": {
       }
    }

, я получаю следующую ошибку:

{
    "category": {
        "non_field_errors": [
            "Invalid data. Expected a dictionary, but got int."
        ]
    }
}

Когда я пытаюсь поместить его в dict, я получаю запросы на поля для категории, которая представляет собой совершенно отдельную таблицу.

У меня нет желания создавать новую запись категории каждый раз, когда я создать новую страницу - я просто хочу связать страницу с категорией.

Как мне это сделать?

Сериализаторы:

class CategorySerializer(serializers.Serializer):
    name = serializers.CharField()
    id = serializers.IntegerField()

class PageSerializer(serializers.ModelSerializer):
    category = CategorySerializer(many=False)

    class Meta:
        model = Page
        fields = ['date', 'intro', "chinese", "english",
                  "calculated_hsk", "translated", "json", "id", "category", "title"]
...