gpt4 book ai didi

python - 带有 View 集路由器查询集过滤的 Django REST 框架

转载 作者:行者123 更新时间:2023-12-04 18:40:52 25 4
gpt4 key购买 nike

我正在使用 Django 1.7 并使用 REST 框架,我已经实现了一个简单的 API 来获取模型中的所有对象,但我想过滤结果并放置一个外部对象值。

例如,实际上我可以有一个带有这个 URL 的对象列表

http://localhost:8000/api/ocompradetalle

如果我只想要一个,我只能像这样放置 PK (PrimaryKey)
http://localhost:8000/api/ocompradetalle/1/

我想更改主键以按外部字段值过滤,我的意思是,我有一个文档(OCompra),在“folio”字段上有一个值,这个文档会有很多细节(OCompraDetalle),所以,我想能够把这样的东西:
http://localhost:8000/api/ocompradetalle/F2033

“F2033”是一个“作品集”值,响应应该为我带来 OCompra 对象的所有详细信息,并在“作品集”字段中使用此值。

这就是我目前所拥有的。

urls.py >> 我有接受 ViewSets 的路由器
from rest_framework import routers
from inventario_rfid.views import OCompraViewSet, OCompraDetalleViewSet
from administracion.views import ProductoViewSet

router = routers.DefaultRouter()
router.register(r'ocompra',OCompraViewSet)
router.register(r'ocompradetalle',OCompraDetalleViewSet)
router.register(r'producto',ProductoViewSet)

urlpatterns = patterns('',
...
#APIS
url(r'^api/',include(router.urls)),
)

serializers.py
from rest_framework import serializers
from administracion.serializers import ProductoSerializer
from .models import OCompra, OCompraDetalle

class OCompraSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = OCompra
fields = ('folio','codigo_proveedor','nombre_proveedor','status','fecha','subtotal','iva','envio',
'otro','total',)

class OCompraDetalleSerializer(serializers.HyperlinkedModelSerializer):
producto = ProductoSerializer(many=False)
ocompra = OCompraSerializer(many = False) << I WANT TO FILTER BY THIS (ocompra__folio)
class Meta:
model = OCompraDetalle
fields = ('ocompra','producto','cantidad_ordenada','cantidad_recibida','fecha_entrega','precio','epc')

View .py
class OCompraDetalleViewSet(viewsets.ModelViewSet):
queryset = OCompraDetalle.objects.all()
serializer_class = OCompraDetalleSerializer


class OCompraViewSet(viewsets.ModelViewSet):
queryset = OCompra.objects.all()
serializer_class = OCompraSerializer

模型.py
class OCompra(models.Model):
folio = models.CharField(max_length=15)
codigo_proveedor = models.CharField(max_length=15)
nombre_proveedor = models.CharField(max_length=100)
status = models.IntegerField(default=0)
fecha = models.DateTimeField(auto_now_add=True)
usuario = models.ForeignKey(User)
subtotal = models.DecimalField(default=0,decimal_places=2, max_digits=20)
iva = models.DecimalField(default=0,decimal_places=2, max_digits=20)
envio = models.DecimalField(default=0,decimal_places=2, max_digits=20)
otro = models.DecimalField(default=0,decimal_places=2, max_digits=20)
total = models.DecimalField(default=0,decimal_places=2, max_digits=20)
def __unicode__(self):
return self.folio

class OCompraDetalle(models.Model):
ocompra = models.ForeignKey(OCompra,related_name='detalles')
producto = models.ForeignKey(Producto)
cantidad_ordenada = models.DecimalField(default=0,decimal_places=2, max_digits=10)
cantidad_recibida = models.DecimalField(default=0,decimal_places=2, max_digits=10)
fecha_entrega = models.DateField(blank=True,null=True)
precio = models.DecimalField(default=0,decimal_places=2, max_digits=10)
epc = models.CharField(max_length=25,null=True,blank=True)

最佳答案

好的,所以如果我理解正确,您希望能够过滤 OCompraDetalle 对象列表,并且能够将查找字段设置为连接表(Ocompra)中的值。这个 View 集应该为你做这两件事

from rest_framework import filters
OCompraDetalleViewSet(viewsets.ModelViewSet):
filter_backends = (filters.DjangoFilterBackend,)
filter_fields = ('precio','ocompra__envio')

serializer_class = OCompraDetalleSerializer
queryset = OCompraDetalle.objects.all()
lookup_field = "ocompra__folio"

所以:
http://localhost:8000/api/ocompradetalle/1/

将为您提供 ocompradetalle 对象,其中 ocompradetalle.ocompra.folio 等于 1。这仅适用于一对一映射或作品集列具有唯一索引的情况。详细 View 不能返回多个对象

如果您想按连接表上的列进行过滤,您可以执行以下操作:
http://localhost:8000/api/ocompradetalle/?ocompra__envio=blah

你会得到所有的 ocompradetalles,其中 ocompradetalle.ocompra.envio = blah

关于python - 带有 View 集路由器查询集过滤的 Django REST 框架,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26595906/

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