我有一个带有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
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()函数引起问题的原因。
答案 0 :(得分:0)
您不能将参数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
注意:通常,类名是用
PerlCase
写的(就像您做的一样),而属性是用snake_case
[wiki]写的,所以用prod
而不是,Prod
modo_ventas
而不是等Modo_Ventas