在Q对象中,如何遵循中间“通过”模型
我试图在一个查询中获得id
的所有Property
对象的列表,这些对象是User
的成员
User
是BusinessUnit
到BusinessUnitMember
的成员
我如何使用一个Q对象生成一个过滤器,该对象为特定的User
查找所有(多个)BusinessUnitMember
,然后为这些BusinessUnitMember
查找所有(多个)BusinessUnit
class Property(BaseModel):
"""Physical Things belonging to various Business Units"""
category = models.CharField(max_length=255, choices=CATEGORY_CHOICES)
objects = PropertyQuerySet.as_manager()
@property
def asset(self):
asset_maps = {
'typea': 'type_a_asset',
'typeb': 'type_b_asset',
}
if self.category not in asset_maps:
return None
return getattr(self, asset_maps.get(self.category), None)
class AssetBase(models.Model):
"""Abstract Base Asset model."""
business_unit = models.ForeignKey('BusinessUnit', null=True, on_delete=models.SET_NULL)
class TypeAAsset(AssetBase):
"""Type A Assets"""
property = models.OneToOneField('Property', null=True, on_delete=models.CASCADE,
related_name='type_a_asset')
class TypeBAsset(AssetBase):
"""Type B Assets"""
property = models.OneToOneField('Property', null=True, on_delete=models.CASCADE,
related_name='type_b_asset')
class BusinessUnit(models.Model):
name = models.CharField(max_length=255)
owner = models.ForeignKey('core.User', null=True,
on_delete=models.SET_NULL,
related_name='owned_business_units')
class BusinessUnitMember(models.Model):
""" ``through`` model for BU and members. """
business_unit = models.ForeignKey('BusinessUnit', on_delete=models.CASCADE)
member = models.ForeignKey('core.User', on_delete=models.CASCADE)
我需要找到当前User
所属的所有Property
对象的id
我在想一个过滤器,比如:
available_ids = Property.objects.filter(Q(type_a_asset__business_unit__in=user.businessunitmember.all().businessunit_set.all())).values_list('id', flat=True)
但是
businessunitmember_set.all().businessunit_set.all()
部分不起作用,因为businessunitmember_set.all()
返回一个queryset对象,该对象将不具有'businessunit_set'
属性。使用businessunitmember_set.get()
也不起作用,因为它将返回3个结果,而不是1个
我已经通过对各个模型进行迭代来实现它,但是这些模型当然会创建大量的查询
目前没有回答
相关问题 更多 >
编程相关推荐