【问题标题】:Django model with many-to-one or none relationship vs many-to-many through?具有多对一或无关系的Django模型与多对多的关系?
【发布时间】:2014-05-16 23:20:15
【问题描述】:

我正在尝试构建一个应用程序,让人们可以查看政治家发布的推文,我正在努力寻找正确的方法来指定 Twitter 上的用户和离线用户之间的关系。例如,一位政客可能有两个 Twitter 账户,而这些账户可能会提及其他三个非政客的 Twitter 用户。现在,我有一个包含来自 Twitter API 的信息(例如,关注者数量、推文数量)的用户表,其中包含来自政治家账户和她/他提到的账户的 Twitter 信息,以及一个立法者表,其中包含有关立法者的信息(例如,政党、议院)。

  • 用户在 twitter_id 上与立法者相关
  • 用户可以在立法者表中有 0 或 1 个条目
  • 立法者在用户表中可以有 0、1 或 n 个条目

如何为 Django 正确设置该模型?如何访问模板中的用户和立法者信息?通过以下设置,我无法从 user.legislator_set 访问立法者表中的任何内容。

class User(models.Model):
  id = models.IntegerField(primary_key=True)
  twitter_id = models.CharField(max_length=21, unique=True)
  twitter_name = models.CharField(max_length=55, unique=True)
  fullname = models.CharField(max_length=45)
  followers = models.IntegerField()
  following = models.IntegerField()
  favorites = models.IntegerField()
  tweets = models.IntegerField()
  timezone = models.CharField(max_length=45, blank=True)

class Legislator(models.Model):
  id = models.IntegerField(primary_key=True)
  last_name = models.CharField(max_length=17, blank=True)
  first_name = models.CharField(max_length=11, blank=True)
  chamber = models.CharField(max_length=3, blank=True)
  state = models.CharField(max_length=2, blank=True)
  party = models.CharField(max_length=11, blank=True)
  twitter_id = models.ForeignKey(User, to_field = "twitter_id", related_name="%(app_label)s_%(class)s_id")
  twitter = models.ForeignKey(User, to_field = "twitter_name", related_name="%(app_label)s_%(class)s_name")

【问题讨论】:

  • 您所说的“用户与twitter_id 上的立法者有关”是什么意思?如果每个Legislator 有多个User 实例,则不可能使它们全部与twitter_id 匹配,除非所涉及的所有User 实例都具有相同的twitter_id。在我看来,您只需要在您的 User 模型上添加一个 legislator = models.ForeignKey(Legislator, null=True) 字段,并删除 Legislator.twitter_id 和 Legislator.twitter 字段,但我可能看不到您的整个场景。
  • “用户在twitter_id 上与立法者有关”我的意思是 twitter_id 是我匹配它们的方式(如果我不使用 Django 并且只是从MySQL数据库)。 legislator = models.ForeignKey(Legislator, null=True) 用什么来关联这两个表?

标签: python django django-models model


【解决方案1】:

利比。如果我了解您的要求,这似乎是最简单的起点——使用 ForeignKey 字段的多对一关系。 (这和lanzz的建议基本一样。)

class User(models.Model):
  twitter_id = models.CharField(max_length=21, unique=True)
  twitter_name = models.CharField(max_length=55, unique=True)
  # ... other fields characterizing a Twitter account
  legislator = models.ForeignKey('Legislator', blank=True, null=True)

class Legislator(models.Model):
  last_name = models.CharField(max_length=17, blank=True)
  first_name = models.CharField(max_length=11, blank=True)
  # ... other fields characterizing a legislator

在您的 Python 代码中,给定 Twitter 帐户 u 和立法者 l,您将运行 u.legislator = l 以将立法者与 Twitter 帐户相关联。您也可以将其表达为 l.user_set.add(u),考虑到这些模型,这对我来说更有意义。

同样,您可以使用 Legislator.user_set 访问 Twitter 帐户的相关管理器。当您想要使用相关模型(任何/所有相关 Twitter 帐户)而不是您拥有的模型(立法者)时,这是您在模板中循环或执行其他查询的内容。

还有几个使用示例in the docs。

在ForeignKey 字段中,我设置了blank=True, null=True 以使关系可选。除非您在字段的选项中另外指定,否则 Django 将在 User 表中创建并使用 legislator_id 列来管理关系。

【讨论】:

  • 啊,好的。所以我将legislator = models.ForeignKey('Legislator', blank=True, null=True) 添加到用户,在我的例子中,运行一堆l.user_set.add(u) 调用来为我已经拥有的数据创建关联。我认为blank=True, null=True 是我挂断电话的一部分——如何使这种关系成为可选的。谢谢,Brian 和 lanzz。
猜你喜欢
  • 2011-11-15
  • 2011-06-02
  • 2012-07-28
  • 2019-05-09
  • 2018-05-21
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2018-01-04
相关资源
最近更新 更多