gpt4 book ai didi

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

转载 作者:太空宇宙 更新时间:2023-11-03 20:09:36 25 4
gpt4 key购买 nike

我有一个带有 2 个相关表的 ApiRest,我想以 Json 形式显示数据,就像我在序列化器图像中发布的文档一样。

这是我的项目:

这是我的Model.py我将 Movimientos 与 Productos 表关联起来

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)

Urls.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,但我无法执行 POST。

我认为是 .create() 函数导致了问题。

最佳答案

您无法将参数 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)
<b>mov.Prod.add(product)</b>
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.

关于python - 显示相关表中的数据 (Django),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58779849/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com