React / DRF: как обрабатывать отношения «многие ко многим» в запросе POST? - PullRequest
1 голос
/ 25 апреля 2020

Как мне убедиться, что отношения «многие ко многим» учитываются в моем POST-запросе к Django Rest Framework API?

У меня есть следующие модели:

models.py

class Tag(models.Model):
    name = models.CharField(max_length=50, unique=True)

    def __str__(self):
        return self.name

class Blog(models.Model):
    name = models.CharField(max_length=100)
    description = models.TextField()
    tags = models.ManyToManyField(Tag, blank=True, related_name="blogs")
    url = models.URLField(max_length=250, unique=True)
    owner = models.ForeignKey(User, related_name="blogs", on_delete=models.CASCADE)
    slug = models.CharField(max_length=20, default="blogs")

    def __str__(self):
        return self.name

И я делаю запрос как:

Интерфейс (не обращайте внимания на пропущенные скобки)

const addContent = (content) => {
    axiosInstance
      .post(`/content/blogs/`, content, tokenConfig(auth.token))
      .then((res) => {
        dispatchMessages(
          createMessage({ contentAdded: "Submitted successfully" })
        );

Объект содержимого, который я передаю, выглядит следующим образом:

const content = {
      name: "content title",
      description: "content description",
      url: "content URL",
      tags: ["tag1", "tag2", "tag3"],
    };

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

Пример ответа:

 {
        "id": 2,
        "tags": [],
        "name": "Blog #1",
        "description": "Its the best",
        "url": "https://website.com",

    },

Мой сериализатор выглядит так:

serializers.py

class BlogSerializer(serializers.ModelSerializer):
    tags = serializers.SlugRelatedField(many=True, read_only=True, slug_field="name")
    owner = CustomOwnerField(read_only=True)
    class Meta:
        model = Blog
        fields = "__all__"

И набор:

api.py

class BlogViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]
    serializer_class = BlogSerializer

    def get_queryset(self):
        return Blog.objects.all()

Спасибо за любые советы

1 Ответ

1 голос
/ 25 апреля 2020

вы проделали всю утомительную работу. Единственное, что не позволяет тегам быть сохраненными, это read_only=True в аргументе SlugRelatedField. Этот аргумент игнорирует поле при его публикации. Поэтому вы должны удалить read_only=True, чтобы теги были проанализированы. Я бы добавил go немного дальше и добавил бы queryset в поле slugrelated как queryset=Tags.objects.all()

Это сработало бы, только если вы уже создали теги в своей базе данных, а затем добавили те же имена в свой список. Если вы хотите создавать их динамически при публикации, вы должны изменить метод создания по умолчанию в вашем сериализаторе ( отметьте здесь )

...