django 多对多对象关系的查询集

jexiocij  于 2023-02-20  发布在  Go
关注(0)|答案(1)|浏览(119)

需要发布许多项目一次-许多标题-在标题列表中从移动的应用程序到后端,问题是当使用创建方法内的循环,它得到的数据库中没有记录&该类型错误-直接赋值给一个多对多集的前端是禁止的。使用container.set()代替。-当尝试使用set()方法时,它没有显示任何正确的大小写!!!!,问题是何时使用create以便在多对多关系中创建多个create对象。请指导。
models.py

class Container(models.Model):
    name = models.CharField(max_length=200, blank=False)
    capacity = models.IntegerField( null=False ,blank=False)

class Item(models.Model):
    title = models.CharField(max_length=200, blank=False)
    container = models.ManyToManyField(container)

serializers.py

class ContainerSerializer(serializers.ModelSerializer):
    class Meta:
        model = Container
        fields = '__all__'

class ItemSerializer(serializers.ModelSerializer):
    class Meta:
        model = Item
        fields = '__all__'

请求

{
"container": {
        "name": "container1",
        "capacity": 10,
         },
"Items":[
    {"title":"tl1",},
    {"title":"tl2",},
    {"title":"tl3",}
    ]
}

view.py

@api_view(['POST'])
def additems(request):

    data = request.data
    
    container = Container.objects.create(
        name = data['name']
        capacity = data['capacity']
        )
    container.save()

    for i in Items:

        item = Item.objects.create(
        container = container ,
        title = i['title'] ,    
                  )
        item.save()

    serializer = ContainerSerializer(container, many=False)
    return response(serializer.data)

TypeError:禁止直接赋值给多对多集的前端。请改用container.set()。为什么出现此错误?!!!请指导...

b1zrtrql

b1zrtrql1#

出现此错误的原因是,您试图在for循环中使用create()方法创建Container对象并将其分配给Item模型上的ManyToManyField。这将导致为循环的每次迭代创建新容器,而这不是您所希望的。此外,当尝试将Item对象添加到与Container对象的多对多关系中时,应该使用add()方法,而不是set() method。可以如下所示重构view

@api_view(['POST'])
def additems(request):
    data = request.data

    # Create the container
    container = Container.objects.create(
        name=data['container']['name'],
        capacity=data['container']['capacity']
    )

    # Create the items and add them to the container
    items = data['Items']
    for item_data in items:
        item = Item.objects.create(title=item_data['title'])
        container.item_set.add(item)

    serializer = ContainerSerializer(container)
    return Response(serializer.data)

ContainerSerializer中,需要将ItemSerializer指定为嵌套序列化器,以便正确序列化通过多对多关系与Container关联的Item对象,如下图所示:

class ContainerSerializer(serializers.ModelSerializer):
    items = ItemSerializer(many=True, read_only=True)

    class Meta:
        model = Container
        fields = ['id', 'name', 'capacity', 'items']

相关问题