Django:何时使用模型字段以及何时使用反向查询。

时间:2018-01-10 18:26:36

标签: python django django-models

我对Django模型的最佳实践有疑问。我有webscraper运行索引'广告','卖家'和'搜索'。

这些模型的(简化)表示如下所示:

class Search(models.Model):
   date: models.DatetimeField(auto_now=True)


class Seller(models.Model):
   name: models.CharField(max_length=500)
   profile_url: models.CharField(max_length=500)


class Ad(models.Model):
   title: models.CharField(max_length=500)
   price: models.FloatField()
   seller: models.Foreignkey(Seller, related_name='ads')
   found_in: models.Foreignkey(Search, related_name='ads')

我正在为这些不同的模型创建详细视图,每个模型都显示统计信息。对于“卖家”模型,我想显示“总广告”,“平均价格”和“中间价格”属性,对于搜索我也想显示这些。

我想知道的是我应该如何获取这些数据。我可以通过反向查询(Seller.ads等)来完成,或者我可以在每次抓取操作后设置的Seller模型上创建一个新字段。

设置这些可以通过简单查询轻松检索的字段似乎有些愚蠢,但是这个数据库可能会达到成千上万行,所以从长远来看它可能会变慢。我基本上想知道最佳实践是什么,并且如果通过数据库查询检索信息与在模板文件上设置信息并从那里获取信息之间存在某种特定的“切点”。

1 个答案:

答案 0 :(得分:1)

您可以使用,总和和平均来注释卖家查询。中位数有点棘手,您可以自己动手,也可以使用Making a OneToOne-relation lazy来提供聚合功能。

from django.db.models import Avg, Sum
from django_extra_tools.db.models.aggregates import Median

sellers_annotated = Seller.objects.all().annotate(
    total_ads = Count('ads')
  ).annotate(
    average_price = Average('ads__price')
  ).annotate(
    median_price = Median('ads__price')
  )