Django ORM中具有唯一组合的反向关系(ForeignKey)
嗨,我只是想知道通过Django ORM这是否可行: 请忽略模型名称等,它们不是真实的Django ORM中具有唯一组合的反向关系(ForeignKey),django,django-models,django-related-manager,Django,Django Models,Django Related Manager,嗨,我只是想知道通过Django ORM这是否可行: 请忽略模型名称等,它们不是真实的 class Image(models.Model): ... item = models.ForeignKey(Bag, related_name="images") flag_frontpage_image = models.BooleanField() imagefile = models.ImageField(upload_to="items/%m/%Y") ..
class Image(models.Model):
...
item = models.ForeignKey(Bag, related_name="images")
flag_frontpage_image = models.BooleanField()
imagefile = models.ImageField(upload_to="items/%m/%Y")
...
class Item(models.Model):
...
在views.py中:
class LandingPageView(SomeMixin,SomeOtherMixin,ListView):
....
def get_context_data(self, **kwargs):
context = super(LandingPageView, self).get_context_data(**kwargs)
context['items'] = Item.objects.prefetch_related('images').order_by('?').all()[:10]
return context
这是好的,工作正常,我想实现的是,我想在视图中获取一个查询,应用一个连接到图像中。
LandingPageView显示带有标记为frontpage图像的图像的项目列表,Django指出(正确地说是SQL)不可能使用反向选择,因为项目可以有多个图像,但是…一个项目只能有一个frontpage图像。
我知道在重构方面还有其他方法可以实现这一点,目前由于我更喜欢避免分区模型,所以我采用了混合方式:
class GetFeaturedMixin(object):
@property
def featured_image(self):
if self.images.count > 0:
for image in self.images.all():
if image.flag_frontpage_image == 1:
return image.imagefile
class Item(models.Model, GetFeaturedMixin):
...
然后在视图中:
<img src="{{ item.featured_image }}">
这很好,但我想知道是否有办法通过Django关系查询集在单个查询集中获取整个集合。
请不要回答或询问原始查询,我知道它们确实存在,甚至在这种类型上也使用过它们,我只是想知道是否可以通过ORM层实现上述功能
self.images.filter(flag_frontpage_image=True)
显然比pythonical迭代所有这些内容要好。但这会创建额外的查询,因为这是一个反向查找,这就是为什么我使用上述方法迭代它们,因为与初始预取相关的内容会获取项目的所有图像。我将再次检查以确保thoughChecked,我会为每个调用特征图像的调用获得1个额外的查询,因此与迭代相比不是首选的。我忘记了预取。至于这个问题,我想不出一个设计,你正在做的查询可以通过ORM获得,因为它是一个条件或计算