我目前正在开发一款django应用程序,我有两个模型:
class Job(models.Model):
def __unicode__(self):
return self.job_number
area = models.ForeignKey(Area)
customer = models.ForeignKey(Customer)
job_address = models.ForeignKey(Address, null=True)
job_status = models.ForeignKey(JobStatus)
surveyor = models.ForeignKey(Employee, null=True)
job_dates = models.OneToOneField(JobDates, null=True)
job_title = models.CharField(max_length=50, null=False)
job_number = models.CharField(max_length=15, null=False, unique=True)
deposit_amount = models.DecimalField(null=True, decimal_places=2, max_digits=10)
is_deposit_paid = models.BooleanField(default=False)
is_deposit_required = models.BooleanField(default=False)
particular = models.SmallIntegerField(null=True)
description = models.TextField(null=True)
surveyor_note = models.TextField(null=True)
contractor_note = models.TextField(null=True)
class Picture(models.Model):
def __unicode__(self):
return self.file_name
job = models.ForeignKey(Job, related_name='picture_job_set')
url = models.CharField(max_length=450, null=False, unique=True)
file_name = models.CharField(max_length=50, null=False)
is_main_pic = models.BooleanField(default=False)
title = models.CharField(max_length=50, null=True)
description = models.TextField(null=True)
date_uploaded = models.DateTimeField(null=False)
uploaded_by = models.ForeignKey(Employee, null=False)
因此,这是一对多的关系,每个作业可以有许多与之相关的图片。现在在图片模型中,我有“is_main_pic”列,用于在列表视图中显示图片,当他们点击它时,它会转到详细信息并显示其余图片。现在我的问题是每当我尝试过滤以在列表视图中的每个作业中获取主图片时,如果满足任何图片的条件,它将返回列表视图中每个作业的所有图片。我的查询如下:
Jobs.objects.filter(picture_job_set__is_main_pic=True).prefetch_related('picture_job_set')
现在,当我去访问picture_job_set时,它包含与作业关联的所有图片,即使他们的“is_main_pic”列为false。 我希望能够在模板视图中首先调用picture_job_set,因为每个作业总会只有一张主图片。到目前为止,我能够通过简单地在模板中使用if语句来确定哪个是主要的图片来解决这个问题,但这看起来很麻烦且效率低下。
我是否误解了RelatedManager的工作原理?我是否必须调用两个查询才能实现此目的?来自ASP MVC背景,我可以通过以下方式实现这一目标:
List<JobIndexViewModel> viewModel = await db.Jobs
.Select(x => new JobIndexViewModel
{
JobID = x.JobID,
JobTitle = x.JobTitle,
JobNumber = x.JobNumber,
BidExpireDate = x.JobDates.BidExpireDate,
JobPostedDate = x.JobDates.JobPostedDate,
City = x.Address.City,
PictureUrl = x.Pictures.Where(t => t.IsMainPic == true).Select(t => t.Url).FirstOrDefault()
}).ToListAsync();
答案 0 :(得分:1)
我现在玩django,将你的查询解释为:
给我所有有图片来自picture_job_sets的乔布斯,因为 其中一张图片标记为主图片。
就像你说的那样,如果任何图片符合条件,它会返回列表视图中每个作业的所有图片。
引用您:每个作业总会只有一张主图片。如果总是有主图片,您可以轻松地从图片中开始查询:
Picture.objects.filter(is_main_pic =真).select_related(&#39;工作&#39)
然后你可以迭代每张图片并在每张图片上做.job以获得相关的工作。
最后一件事,我怀疑你因为你的设计而遇到这个问题。如果将主要图片作为字段移动到作业模型,您是否拥有更简单的设计?