【发布时间】:2018-11-01 15:55:39
【问题描述】:
我有以下模型(这些模型已大大简化):
class Job(models.Model):
name = models.CharField(max_length=255)
def get_date_details(self):
pass
#return a list of all jobdate --> details
class JobDate(models.Model):
job = models.ForeignKey(Job, on_delete=models.CASCADE, related_name='dates')
date = models.DateField()
# ... and a bunch of other fields
class JobDateDetail(models.Model):
job_date = models.ForeignKey(JobDate, on_delete=models.CASCADE, related_name='details')
detail = models.CharField(max_length=255)
# ... and a bunch of other fields
并且经常需要为数据库中的所有作业(几千个)处理JobDateDetails。我知道我可以使用如下查询预取所有数据:
q = Job.objects.all().prefetch_related('dates', 'dates__details')
但是我不确定如何最好地利用Job.get_date_details() 中的预取数据。一种选择是执行以下操作:
class Job(models.Model):
def get_date_details(self):
details = []
for job_date in self.dates.all():
details += [detail for detail in job_date.details.all()]
return details
但是,我怀疑可能有一种方法可以直接查询所有这些 JobDateDetail 对象。需要注意的一件事——如前所述,我意识到我可以通过另一个方向来一次获取所有细节,但是在这种情况下,我使用的是 Django Rest Framework,并且需要将细节组装为 Job 序列化程序中的一个字段,要求我从这个方向走。想法?
【问题讨论】:
-
您可以尝试将
Prefetchobject 与to_attr和values_list()结合使用。例如,您的for循环几乎等于chain.from_terable(list(job_date.details.all().values_list('detail')))。 -
除非我误解你的意思,否则我的印象是
.values和.values_list与预取不兼容:code.djangoproject.com/ticket/26565 -
这个想法是预取
JobDate,然后使用values()。我刚刚意识到get_date_details是Job的一种方法,而不是JobDate的一种方法,而且我目前还没有安装Django。 -
q = Job.objects.all().prefetch_related()提供表级功能,而get_date_detals()提供row-level functionality。你想把它们结合起来吗?您对 DRF 的看法是什么?我猜它适合工作及其日期详细信息。 -
您不能在
JobSerializer上使用SerializerMethodField,它可以一次性检索所有详细信息,但仍允许您将job_details指定为JobSerializer上的字段吗?
标签: django orm django-rest-framework foreign-keys