Django模型与多对一或无关系与多对多通过?

时间:2014-04-04 14:59:58

标签: python django django-models model

我正在尝试构建一个应用程序,让人们查看政治家发布的推文,我正在努力用正确的方式来指定Twitter上的用户与离线用户之间的关系。例如,一个政治家可能有两个Twitter账户,这些账户可能会提到其他三个不是政治家的Twitter用户。现在,我有一个User表,其中包含来自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")

1 个答案:

答案 0 :(得分: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帐户的RelatedManager。这是您在模板中循环或对您希望使用相关模型(任何/所有相关的Twitter帐户)而不是您拥有的(立法者)时进行其他查询。

还有一些使用示例in the docs

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