【问题标题】:sql & django: Making aggregation on database levelsql & django:在数据库级别进行聚合
【发布时间】:2015-06-18 08:21:49
【问题描述】:

您好,我的模型中有以下情况:

class Package(models.Model):
    name

class SetOfItems(models.Model)
    name

class Item(models.Model):
    package(FK)
    setofitems(FK)

我要解决的问题是简化来自 SetOfItems 的查询。例如。如果我需要从 SetOfItems 获取包名,我需要写类似 SetOfItems.objects.values('item__package__name'),它实际上不起作用,在管理站点中很好(例如,如果我在那里创建一个额外的字段)。

所以我正在寻找的是在 SetOfItem 模型中存储有关 Packages 的信息而不建立直接关系(因为我认为如果我将 FK 放在那里,数据完整性将会受到影响,例如它可能会在在 Item 中打包,在 SetOfItems 中打包)..

所以也许有一些可能有 SQL 视图,或者类似的东西......有一个表列自动从其他表中预填充?还是别的什么?

【问题讨论】:

    标签: mysql django django-models


    【解决方案1】:

    Item 是 Package 和 SetOfItems 之间多对多关系中的直通表。所以你应该这样声明它:

    class SetOfItems(models.Model):
        packages = models.ManyToManyField(Package, through='Item')
    

    这根本不会改变你的实际表结构,但它允许你做my_package.setofitems.all()

    【讨论】:

    • 如果我想在 SetOfItems admin 中显示包,这会引发很多查询
    • 您的意思是在更改列表中?如果您对此感到担心,请覆盖 get_queryset 以获取使用 prefetch_related 获取所有包的 QuerySet。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2015-08-16
    • 1970-01-01
    • 2014-03-02
    • 2020-12-31
    • 1970-01-01
    • 2020-10-05
    • 1970-01-01
    相关资源
    最近更新 更多