对 Django Rest ManyToMany 字段的反应 POST 请求

React POST request to Django Rest ManyToMany field

我要做的是post一个ListLink对象,里面包含Link 对象,到数据库。

Link 对象由用户通过输入字段添加并存储在状态中,直到发送请求将它们保存在数据库中。

我正在尝试向 DRF 发出 post 请求,但我收到以下响应:

"Invalid data. Expected a dictionary, but got list."

我正在使用 axios 发出请求:

Home.jsx

handleSave = event => {
    event.preventDefault();

    return axios({
        method: 'post',
        url: 'http://localhost:8000/api/lists/',
        headers: { 
            'Authorization': 'Token ' + localStorage.getItem('token')
        },
        data: {
            links: this.state.links,
            name: this.state.listName
        }})
        .then(res => {
            console.log(res);
        });
}

这是我用来保存列表的状态:

    this.state = {
        listName: 'Link List',
        listDescription: 'Add description here',
        listURL: '',
        currentLink: 'https://www.example.com',
        links: []
    };

这是我的模型和序列化程序:

Link列表

class LinkList(models.Model):
owner = models.ForeignKey(
    User,
    related_name='lists',
    on_delete=models.CASCADE)
name = models.CharField(max_length=100)
description = models.CharField(max_length=250)
public = models.BooleanField(default=False)
links = models.ManyToManyField(
    Link,
    related_name='linklists')

def __str__(self):
    return "%s - %s" % (self.owner, self.name)

def save(self, *args, **kwargs):
    super().save(*args, **kwargs)

序列化器:

class LinkListSerializer(serializers.ModelSerializer):
url = serializers.HyperlinkedIdentityField(view_name="lists-detail")
owner = serializers.ReadOnlyField(source='owner.username')
links = LinkSerializer()

class Meta:
    model = LinkList
    fields = ['url', 'owner', 'name', 'public', 'links']

Link

class Link(models.Model):
link = models.URLField(max_length=200)

def __str__(self):
    return "%s" % (self.link)

序列化器:

class LinkSerializer(serializers.ModelSerializer):
class Meta:
    model = Link
    fields = ['url', 'link']

您可以尝试将 many=True 参数添加到 LinkSerializer 但您需要自己处理此列表(弹出 links 属性并手动创建每个 link 对象) .

class LinkListSerializer(serializers.ModelSerializer):
    ...

    def create(self, validated_data):
        with transaction.atomic(): # optional - ensure that changes will be rolled back on error
            links = validated_data.pop('links', [])
            instance = super().create(validated_data)
            for l in links:
                instance.links.create(link=l)
            return instance