【问题标题】:Django Queryset based on 2-3 related tablesDjango Queryset 基于 2-3 个相关表
【发布时间】:2020-07-02 08:37:42
【问题描述】:


我在数据库中有 3 个相关的表。

from django.db import models

# Create your models here.
class Country(models.Model):
    country_code = models.CharField('Country code', unique=True, max_length=3)
    country_name = models.CharField('Country Name', max_length=25, default="")

class Customers(models.Model):
    dnr = models.CharField('Customer Nr', max_length=8, unique=True)
    dname = models.CharField('Customer Name', max_length=50, default="")
    dcountry = models.ForeignKey(Country, on_delete=models.CASCADE)

class BigTable(models.Model):
    deb_nr_f = models.ForeignKey(Customes, on_delete=models.CASCADE, related_name='debitor_fnr')
    sales_2016 = models.IntegerField('Abs. 2016', default=0)
    sales_2017 = models.IntegerField('Abs. 2017', default=0)
    sales_2018 = models.IntegerField('Abs. 2018', default=0)
    sales_2019 = models.IntegerField('Abs. 2019', default=0)
    sales_2020 = models.IntegerField('Abs. 2020', default=0)
  1. 如何从以下两个表创建查询集:Cutomers 和 Bigtables:
    客户编号 1 /// Sales_2016 /// Sales_2017 /// ...
    客户编号 2 /// Sales_2016 /// Sales_2017 /// ...
    客户编号 ...

  2. 如何从以下三个表中创建查询集:Countries、Cutomers 和 BigTable:
    国家编号 1 /// Sales_2016 /// Sales_2017 /// ...
    国家编号 2 /// Sales_2016 /// Sales_2017 /// ...
    国家编号 ...

谢谢

【问题讨论】:

    标签: django python-3.x django-queryset


    【解决方案1】:

    我假设您正在使用客户模型进行尝试

    从两个表创建查询集:Cutomers 和 Bigtables。 查询

    Customers.objects.values('dnr','dname','debitor_fnr__sales_2016','debitor_fnr__sales_2017'....)
    

    说明:这里我使用查找来访问外键值。在 BigTable 模型中,您已将 deb_nr_f 保存为外键字段,对于 Customer 模型,related_name='debitor_fnr'。因此可以使用相关字段作为 childmodelrelatedname__childfieldname 访问记录。

    从三个表创建查询集:Countries、Cutomers 和 BigTable 查询

    Customers.objects.values('dcountry__country_name','dnr','dname','debitor_fnr__sales_2016','debitor_fnr__sales_2017'....)
    

    解释几乎与上面类似,我在“dcountry”字段的客户模型中使用外键字段访问国家/地区表。所以它就像 parentmodelforeignkeyfield__parentfieldname

    更多信息可以参考documentation

    【讨论】:

    • 感谢您的意见。它仅适用于大表中的单个记录。对不起。忘了提一下,大表包含每个客户/借方的多条记录(因为营业额是根据产品构成的,这是不相关的)。如何在查询集中获取每个客户在提到的时间段内的聚合销售额。谢谢
    • 可以使用注释来完成,您可以参考此文档link1。例如第一个查询:Customers.objects.values('dnr','dname').annotate(Avg('debitor_fnr__sales_2016'))。我希望这能帮到您。对于聚合函数,请遵循 link2
    【解决方案2】:

    观看documentation

    Django 提供了一种强大而直观的方式来“关注”关系 在查找中,自动为您处理 SQL JOIN,在后面 场景。要跨越关系,请使用相关的字段名称 跨模型的字段,用双下划线分隔,直到你得到 到你想要的领域。

    1. BigTable.objects.values('deb_nr_f__dname', 'sales_2016', 'sales_2017', ...)

    2. BigTable.objects.values('deb_nr_f__dcountry__country_name', 'sales_2016', 'sales_2017', ...)

    如果您需要每个客户的 aggregate 总和,您可以这样做

    from django.db.models import Sum
    
    BigTable.objects.values('deb_nr_f').order_by('deb_nr_f').annotate(2016_sum=Sum('sales_2016')).annotate(2017_sum=Sum('sales_2017'))...
    

    【讨论】:

    • 感谢您的意见。它仅适用于大表中的单个记录。对不起。忘了提一下,大表包含每个客户/借方的多条记录(因为营业额是根据产品构成的,这是不相关的)。如何在查询集中获取每个客户在提到的时间段内的总销售额?谢谢
    猜你喜欢
    • 2017-11-15
    • 1970-01-01
    • 2018-10-09
    • 2011-04-18
    • 2022-12-10
    • 1970-01-01
    • 1970-01-01
    • 2016-07-05
    • 2013-07-29
    相关资源
    最近更新 更多