显示相关表中的数据(Django)

2024-04-28 04:24:59 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个包含2个相关表的ApiRest,我想用Json显示数据,就像我在serializers图像中发布的文档一样

这是我的项目:

这是我与Productos表相关的Model.pyi运动

class Movimientos(models.Model):
    Id = models.AutoField(primary_key=True)
    Total = models.IntegerField()
    Modo_Stock = models.IntegerField()
    Modo_Ventas = models.IntegerField()
    Fecha = models.DateField()
    Hora = models.CharField(max_length=60)
    Cantidad = models.IntegerField()
    Importe = models.IntegerField()
    Descripcion = models.CharField(max_length=255)
    Prod = models.ManyToManyField(Productos)
    # Caja = models.ForeignKey(Cajas, on_delete=models.CASCADE)

    class Meta:
        ordering = ('Fecha',)

这是我的Serializers,与我创建的.create()方法类似,但它不起作用

class ProductosSerializer(serializers.ModelSerializer):

    class Meta:
        model = Productos
        fields = '__all__'

class MovimientosSerializer(serializers.ModelSerializer):

    Prod = ProductosSerializer(many=True)

    class Meta:
        model = Movimientos
        fields = '__all__'

    def create(self, validated_data):
        Prod_data = validated_data.pop('Prod')
        mov = Movimientos.objects.create(**validated_data)
        for pro_data in Prod_data:
            Productos.objects.create(mov=mov, **pro_data)
        return mov

我的Views and Urls

class MovimientosList(generics.ListCreateAPIView):
    queryset = Movimientos.objects.all()
    serializer_class = MovimientosSerializer

class MovimientosDetail(generics.RetrieveUpdateDestroyAPIView):
    queryset = Movimientos.objects.all()
    serializer_class = MovimientosSerializer

class MovimientosListSearch(generics.ListCreateAPIView):
    search_fields = ['Descripcion']
    filter_backends = (filters.SearchFilter,)
    queryset = Movimientos.objects.all()
    serializer_class = MovimientosSerializer

def consulta(request, desde, hasta):
    if request.method == 'GET':
        resultados = serializers.serialize('json', Movimientos.objects.filter(Fecha__range=[desde, hasta]))
        return HttpResponse(resultados)

URL.py

path('movimientos/', mov_views.MovimientosList.as_view(), name='movimientos'),
path('movimientos/<int:pk>/', mov_views.MovimientosDetail.as_view()),
path('movimientos/search/', mov_views.MovimientosListSearch.as_view()),
path('movimientos/entrefechas/<str:desde>/<str:hasta>/', mov_views.consulta),

和POST错误POST - Error

JSON:

{
    "Id": 1,
    "Total": 233,
    "Modo_Stock": 2,
    "Modo_Ventas": 2,
    "Fecha": "2019-11-01",
    "Hora": "15:23:00",
    "Cantidad": 34,
    "Importe": 233,
    "Descripcion": "Venta",
    "Prod": [
        {
            "Id": 1,
            "Codigo_Barra": "12342352",
            "Codigo_Producto": "324234",
            "Descripcion": "Cervezas",
            "Precio_Compra": 80,
            "Precio_Venta": 130,
            "Stock_Actual": 58
        }
    ]
}


    raise TypeError("%s() got an unexpected keyword argument '%s'" % (cls.__name__, kwarg))
TypeError: Productos() got an unexpected keyword argument 'mov'
[09/Nov/2019 09:57:31] "POST /movimientos/ HTTP/1.1" 500 17510

我想像文档一样显示json,但我不能完成这篇文章

我认为是.create()函数引起了问题


Tags: dataobjectsmodelscreateprodallclassmov
1条回答
网友
1楼 · 发布于 2024-04-28 04:24:59

您不能将参数mov传递给Productos.objects.create(mov=mov, ...),因为这是一个多对多关系,您应该在创建两个对象后更改该关系,如:

class MovimientosSerializer(serializers.ModelSerializer):
    Prod = ProductosSerializer(many=True)

    class Meta:
        model = Movimientos
        fields = '__all__'

    def create(self, validated_data):
        Prod_data = validated_data.pop('Prod')
        mov = Movimientos.objects.create(**validated_data)
        for pro_data in Prod_data:
            product = Productos.objects.create(**pro_data)
            mov.Prod.add(product)
        return mov

Note: normally class names are written in PerlCase (like you did correctly), but attributes are written snake_case [wiki], so prod instead of Prod, modo_ventas instead of Modo_Ventas, etc.

相关问题 更多 >