【问题标题】:Django: sub-fields within a model fieldDjango:模型字段中的子字段
【发布时间】:2013-02-03 21:42:27
【问题描述】:

在我的主要类模型 Deals 中,我有某些字段,如描述、价格、date_created 等。我现在必须添加一些具有子字段的字段。例如,我正在尝试向交易添加年龄字段。此年龄字段还有子字段(如 score_for_kid、score_for_baby、score_for_old 等),我想从管理员那里编辑这些分数。

这是我的models.py:

class Deals(models.Model):
    description = models.TextField()
    price = models.DecimalField(max_digits=7, decimal_places=2)
    url = models.URLField(verify_exists=False)
    currency = models.CharField(max_length=3)
    created_date = models.DateField(auto_now_add=True)

    kid_score = models.IntegerField(max_length=2,default=0)
    teenager_score = models.IntegerField(max_length=2,default=0)
    youth_score = models.IntegerField(max_length=2,default=0)
    old_score = models.IntegerField(max_length=2,default=0)

我不想在模型中存储所有这些子字段(大约 20-25 个,在 4 个不同的字段中),而是连接到这些子字段的年龄字段。 ManyToManyField 会为此工作吗?

基本要求是当用户在浏览器上选择一个子字段(比如孩子)时,显示所有具有较高孩子分数的对象。

我对 Django 很陌生,任何关于这方面的帮助都会很棒。谢谢。

【问题讨论】:

    标签: django django-models python-2.7


    【解决方案1】:

    如果我正确理解您的问题,您需要使用 ForeignKey 字段。

    class Deals(models.Model):
        description = models.TextField()
        price = models.DecimalField(max_digits=7, decimal_places=2)
        #...
        age = models.ForeignKey(Age)
    
    class Age(models.Model):
        kid_score = models.IntegerField(max_length=2,default=0)
        teenager_score = models.IntegerField(max_length=2,default=0)
        #...
    

    好好阅读docs on Models。您可能还会发现阅读一些关系数据库/基本 sql 很有用。

    当您在 django 管理员中编辑对象时,您可能想要使用 InlineModelAdmin 类。

    更新

    重新阅读您的问题,听起来您可能只是想在主 Deal 模型上显示/隐藏这些附加字段。如果是这种情况,那么您想在管理员中使用带有“collapse”类的字段集。 docs中有一个例子。

    如果您希望每个Deal 记录有多个与之关联的kid_score,那么您需要一个外键。如果每个Deal 只能有一个kid_score,那么您需要在主模型中保留kid_score(和其他)字段(如果这令人困惑,那么一定要阅读一下sql/关系数据库)。

    【讨论】:

    • 感谢 Aidan,我实际上希望每个交易只有一个 child_score(和其他分数),但后来我认为为此设置 25 个字段会使我的模型过于复杂。在上面的代码中,我只有 4 个这样的字段,但我还有更多(针对不同的字段)。我不确定为什么将所有这 25 个字段保留在我的模型中会更好,而不是使用外键来表示年龄等。此外,将“age = models.ForeignKey(Deals)”放在我的 Age 模型类中对我来说效果更好。非常感谢这个概念,一旦我得到它就非常顺利。
    • 如果是这种情况,那么您确实需要将所有内容都保留在一个模型上。虽然您可以创建 OneToOne 字段,但我认为这不是正确的解决方案,因为您的所有交易对象都会有分数。您只需要在 html 中显示隐藏字段。这对于 ModelForms / Django Admin 来说并不难。
    • 是的,我同意,因为每个 Deal 对象只有一个 child_score 等,最好将该字段放在 Deal 模型中。但是,正如我告诉你的,我有很多这样的字段(6 个用于年龄,10 个用于关系等),总共可能有 30 多个这样的字段。具有 30-40 个字段的模型不会使运行查询或其他复杂操作变慢吗?有没有更好的方法来做到这一点并使其更快?
    • 不,这是最快的方法,多个表(模型)会比一个有很多字段的表慢。但是,您可能会发现阅读“规范化”会有所帮助。这是设计关系数据库的标准流程,如果您真的热衷于将数据拆分到单独的表中,它可能会对您有所帮助。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-05-13
    • 2020-09-02
    • 2023-03-31
    • 2019-12-24
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多