我有3个型号 材料,UOM,BIN_UOM
@with_author
class Material(models.Model):
version = IntegerVersionField( )
code = models.CharField(max_length=30)
name = models.CharField(max_length=30)
slug = models.SlugField(max_length=80, blank=True)
description = models.TextField(null=True, blank=True)
materialuom = models.CharField(max_length=1,
choices=UOM_CHOICES)
creation_time = models.DateTimeField(auto_now_add=True, blank=True)
itemgroup = models.ForeignKey(ItemGroup, on_delete=models.PROTECT)
keywords = models.CharField(max_length=50,null=True, blank=True)
valid_from = models.DateTimeField(null=True, blank=True)
valid_to = models.DateTimeField(null=True, blank=True)
min_quantity = models.DecimalField(max_digits=19, decimal_places=10)
trigger_quantity = models.DecimalField(max_digits=19, decimal_places=10)
max_quantity = models.DecimalField(max_digits=19, decimal_places=10)
@with_author
class UOM(models.Model):
version = IntegerVersionField( )
code = models.CharField(max_length=30)
name = models.CharField(max_length=30)
material = models.ForeignKey(Material)
description = models.TextField(null=True, blank=True)
@with_author
class UOM_BINUOM(models.Model):
version = IntegerVersionField( )
UOM = models.ForeignKey(UOM)
BIN_UOM = models.ForeignKey(BIN_UOM)
quantityperunit = models.PositiveSmallIntegerField()
creation_time = models.DateTimeField(auto_now_add=True,blank=True)
在输入中,我有我的材料ID
使用django ORM我想获取材质ID的UOM_BINUOM的所有对象。
在SQL中:
Select * from UOM_BINUOM where UOM_BINUOM.uom in (Select uom from UOM where UOM.material = material)
在ORM中我试图这样:
uombinuom = UOM.objects.filter(material__in=material_id).uom_binuom_set.all().order_by('-id')
或者像这样
material = get_object_or_404(Material, pk=material_id)
uom = material.uom_set.all().order_by('-id')
uombinuom = uom.uom_binuom_set.all().order_by('-id')
但是收到错误
'QuerySet'对象没有属性'uom_binuom_set'
我做错了什么,如何解决这个问题?
答案 0 :(得分:1)
当你这样做时
uom = material.uom_set.all().order_by('-id')
uom
此处为QuerySet
。应该在单个记录而不是记录的QuerySet上调用uom_binuom_set
。
因此,您需要遍历uom
QuerySet并为每条记录调用.uom_binuom_set.all()
。
for record in uom:
uom_binuom = record.uom_binuom_set.all()
# do something with uom_binuom
或者,如果您只想要与uom_binuom
相关的第一条记录,那么
uom_binuom = uom.first().uom_binuom_set.all()
答案 1 :(得分:1)
uom_binuom_set
适用于单个UOM
实例
UOM.objects.get(pk=1).uom_binuom_set.all()
但是,您有UOM_BINUOM.objects.filter(...)
,这是一个查询集。如错误所示,查询集没有uom_binuom_set
方法。
您可以从UOM_BINUOM
模型开始构建所需的查询集。
uombinuom = UOM_BINUOM.objects.filter(UOM__material=material_id)
请注意,由于material_id
是一个ID,因此您无需使用__in
。