Reactjs React/DRF:如何处理POST请求中的多对多关系?

Reactjs React/DRF:如何处理POST请求中的多对多关系?,reactjs,django-rest-framework,Reactjs,Django Rest Framework,如何确保在对Django Rest框架API的POST请求中考虑多对多关系 我有以下型号: 型号.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=10

如何确保在对Django Rest框架API的POST请求中考虑多对多关系

我有以下型号:

型号.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
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__"
class BlogViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]
    serializer_class = BlogSerializer

    def get_queryset(self):
        return Blog.objects.all()
我提出这样的要求:

前端(不要介意缺少括号)

我要传递的内容对象如下所示:

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",

    },

我的序列化程序看起来像:

const content = {
      name: "content title",
      description: "content description",
      url: "content URL",
      tags: ["tag1", "tag2", "tag3"],
    };
序列化程序.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
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__"
class BlogViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]
    serializer_class = BlogSerializer

    def get_queryset(self):
        return Blog.objects.all()
和视图集:

api.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
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__"
class BlogViewSet(viewsets.ModelViewSet):
    permission_classes = [
        permissions.IsAuthenticatedOrReadOnly
    ]
    serializer_class = BlogSerializer

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

谢谢你给我的提示,你已经完成了所有繁琐的工作。唯一不允许保存标记的是
SlugRelatedField
参数中的
read_only=True
。此参数在发布字段时忽略该字段。因此,您必须删除
read_only=True
,以便解析标记。我将进一步在SlugRelated字段中添加
queryset
,作为
queryset=Tags.objects.all()

只有在数据库中已经创建了标记,然后在列表中添加了相同的名称时,这才有效。如果要在发布它们时动态创建它们,则必须修改序列化程序()中的默认创建方法