【问题标题】:Django: Best way to highlight primary/favorite relation in ManyToMany relationshipDjango:在多对多关系中突出主要/最喜欢关系的最佳方式
【发布时间】:2014-11-25 18:02:11
【问题描述】:

在 django 的多对多关系中突出显示特定关系的最佳方式是什么?

例如,如果我想在基因数据库中突出显示对基因的主要或“最佳”引用,我当前的策略(这似乎有些错误和重复)是在 ManyToManyField 之外使用外键:

from django.db import models

class Gene(models.Model):
    name = models.CharField()
    primary_reference = models.ForeignKey(Reference)
    other_references = models.ManyToManyField(Reference)  # doesn't include primary

class Reference(models.Model):
    year = models.CharField()
    author = models.CharField()

这完成了工作,但现在如果我想获得所有引用,我不能只获得gene.references ...(相反,我需要连接primary_referencesother_references

另一方面,如果我只创建一个 ManyToManyField 字段

class Gene(models.Model):
    name = models.CharField()
    referencess = models.ManyToManyField(Reference)  # includes primary

获得gene.primary_reference(相反,gene.other_references,不包括主要)的最佳方式是什么?

我想在参考模型中有一个额外的字段,比如“主要参考”的布尔值......但这不起作用,因为作为对我的案例的附加说明:给定的参考可以引用 许多个基因,而只有一个其参考基因的主要参考。

我还应该指出,在这种情况下,确定“主要”参考的标准不是可以从参考模型中的信息(例如发布日期)中计算出来的。

【问题讨论】:

  • primary_reference 是否应该像代码示例中那样是一个单数 ForeignKey?如果是这样,您在这里所拥有的一切都很好,如果您只寻找非主要参考,那么排除该单一参考应该不会太难。如果有多个主要参考文献的可能性,那么这是一个不同的问题(通过related_through 回答)。
  • 是的,只有一个 primary_reference。因此,对同一模型同时具有 foreignKey 和 ManyToMany 关系不被认为是不好的做法吗?获得所有参考的最佳方式是@property def all_references:吗?
  • 就个人而言,我将ManyToMany 指向所有引用,包括主要引用。如果你想要only 非主要引用,那么你可以构造一个这样的查询:gene.references.exclude(id=gene.primary_reference_id)
  • 感谢您的帮助!
  • @michaelb:考虑把它写下来作为答案,也许更详细一点,并获得你应得的荣誉。

标签: django django-models foreign-keys many-to-many


【解决方案1】:

你如何拥有它很好,我唯一要改变的是有两个字段:references(用于所有引用)和primary_reference。例如:

class Gene(models.Model):
    name = models.CharField()
    primary_reference = models.ForeignKey(Reference, related_name="primary_reference")
    references = models.ManyToManyField(Reference)

class Reference(models.Model):
    year = models.CharField()
    author = models.CharField()

如果你只想查询非主要引用,那么你可以构造一个这样的查询:

 gene.references.exclude(id=gene.primary_reference_id)

如果primary_reference 可以有多个,那么您将需要使用Django's related_through feature 将“元数据”添加到关系本身。

【讨论】:

  • 如果我可以问一个相关的问题:如果gene->reference 是OneToMany 参考(每个参考都指一个且只有一个基因)怎么办?这将建立一个具有互惠外键的情况......其中class Gene 有一个ForeignKey(Reference)class Reference 有一个ForeignKey(Gene)......这是可以接受的吗?有更好的策略吗?
猜你喜欢
  • 1970-01-01
  • 2021-11-02
  • 2020-10-07
  • 1970-01-01
  • 2016-08-08
  • 2011-03-10
  • 2014-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多