【问题标题】:How do I connect these two models in Django?如何在 Django 中连接这两个模型?
【发布时间】:2014-08-19 07:18:21
【问题描述】:

我有两个看起来像这样的模型:

class People(models.Model):
    id = models.IntegerField(primary_key=True)
    name = models.CharField(max_length=125, blank=True)
    age = models.IntegerField(blank=True)

class Income(models.Model):
    id = models.IntegerField(primary_key=True)
    person_id = models.IntegerField(blank=True, null=True)
    income = models.IntegerField(blank=True, null=True)

我希望能够在一个查询中获取任意数量的人及其相关收入。但是由于这里没有外键,所以我不能做People.objects.filter(age=40).select_related('income')。如何在不进行原始查询的情况下进行此类查询?如果不可能,为了进行这样的查询,更改表的最佳方法是什么?

【问题讨论】:

  • 你为什么不在这里使用外键? person_id 应该是 People 的外键,对吧?
  • 需要注意的是,在 Django 中拥有 ForeignKey 对象不需要数据库级外键即可工作。因此,即使您的数据库不允许更改,您也可以通过添加 person = models.ForeignKey(People, blank=True, null=True) 轻松完成这项工作
  • 说什么?我不知道。这从根本上改变了这种情况。
  • @Wolph:如果您提供您的评论作为答案,我会接受。
  • @trevorDashDash 添加到 Wolph 答案中,您可以放心地省略 id 字段定义,因为 Django 会自动添加它(它是 Python 的保留字),如果需要,您可以指定使用 db_column 属性的字段的 db 列名称。

标签: django django-queryset django-orm django-1.6


【解决方案1】:

Django 期望 ForeignKey 对象简单地具有名称 yourname_id (尽管即使它是可覆盖的)。由于 Django 还支持没有真正外键支持的数据库,因此外键支持的每一位都由 Django 本身而不是数据库处理,因此不需要数据库外键。除了需要数据库一致性之外(在某些竞争条件下可以很方便地做到这一点)。

然而,在大多数情况下,这将在您的数据库中没有任何外键的情况下工作(注意 id 列是由 Django 隐式添加的):

class People(models.Model):
    name = models.CharField(max_length=125, blank=True)
    age = models.IntegerField(blank=True)

class Income(models.Model):
    person = models.ForeignKey(People, blank=True, null=True)
    income = models.IntegerField(blank=True, null=True)

【讨论】:

    【解决方案2】:
    class People(models.Model):
        #add your field here.
    
    class Income(models.Model):
        person = models.ForeignKey(People, blank=True, null=True)
        #add your income field here (Integer field)....
    

    这将创建一个表(在您的数据库中),其中收入将与人相关。默认情况下,该外键是用户表的自动生成的id字段(默认情况下,id字段,在本例中也是主键,为每个表自动生成,除非另有说明)

    【讨论】:

      猜你喜欢
      • 2020-05-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-12-11
      • 1970-01-01
      • 2019-11-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多