【问题标题】:Two foreign key in the same model from two different model同一模型中的两个外键来自两个不同的模型
【发布时间】:2016-07-07 05:32:16
【问题描述】:

我需要将两个外键放入来自两个不同模型的模型类中。我想将第三个模型类与第一个和第二个模型类联系起来。

我尝试过这样的事情:

class A (models.Model)
    id_A = models.IntergerField (primary_key=True)
    #...

    class B (models.Model)
     id_B = models.IntergerField (primary_key=True)
    #...

    class C (models.Model)
      id_A = models.ForeignKey(A)
      id_B = models.ForeignKey(B)

阅读文档我知道不可能有MultipleColumnPrimaryKeys...但我没有收到来自 django 的任何错误与此 models.py

有可能吗?有没有更聪明的方法?

谢谢!

【问题讨论】:

    标签: python django django-models


    【解决方案1】:

    你做得很好,如果你将 id_A 和 id_B 关联到同一个模型,django 会给你一个错误,在这种情况下,只需将 related_name 属性放在第二个字段中。

    【讨论】:

    • 好的,我正要找到关于related_name 属性的答案,但你已经回答我了!!谢谢!
    【解决方案2】:

    Django 没有弹出错误,因为你做得对。一个模型中有多个外键是完全合理的,就像 C 类一样。

    在C类中,只要id_A和id_B是自己模型的单列主键,就可以完美解决。

    您提到的“MultipleColumnPrimaryKeys”是另一回事。这意味着对于数据库中的特定表,有多个列一起作为表的主键,这在Django中是不支持的。

    【讨论】:

    • 非常感谢!!我是新手,我现在正在尝试一切!再见!
    【解决方案3】:

    您可以使用多对多关系自动为您创建中间模型:

    from django.db import models
    
    
    class Publication(models.Model):
        title = models.CharField(max_length=30)
    
    
    class Article(models.Model):
        headline = models.CharField(max_length=100)
        publications = models.ManyToManyField(Publication, related_name='articles')
    

    有了这个,你可以同时做到:

    publication.articles.all()  # Gives you the articles of the current publication instance
    article.publications.all()  # Gives you the publications of the current article instance
    

    查看many to many的文档

    如果您需要在该中间模型中使用任何其他字段,您可以告诉 django 哪个是 through 模型,如下所示:

    from django.db import models
    
    
    class Person(models.Model):
        name = models.CharField(max_length=128)
    
    
    class Group(models.Model):
        name = models.CharField(max_length=128)
        members = models.ManyToManyField(Person, through='Membership')
    
    
    class Membership(models.Model):
        person = models.ForeignKey(Person)
        group = models.ForeignKey(Group)
        date_joined = models.DateField()
        invite_reason = models.CharField(max_length=64)
    

    查看extra fields on many to many的文档

    此外,如果您要使用标准整数自增主键,django 已经为您生成了一个,因此您无需定义 id_Aid_B

    【讨论】:

    • 感谢您的回答。其实id_A和id_B不是自增主键,而是UUIDField:我现在才发现我写的不对。
    猜你喜欢
    • 2017-10-13
    • 2018-11-11
    • 1970-01-01
    • 2021-04-01
    • 2016-12-07
    • 2016-01-01
    • 2012-02-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多