【问题标题】:Double Foreign Key in Django?Django中的双外键?
【发布时间】:2011-03-02 00:34:22
【问题描述】:

有没有在 Django 中模拟双外键?

例如,如果我有表格:audio、overlay、html 和表:timeline_item,它有一个字段 id,以及一个指定音频、覆盖或 html 的字段类别...

有谁知道我将如何在 Django 中进行建模?或者是否有可能?

【问题讨论】:

    标签: sql django foreign-keys


    【解决方案1】:

    听起来像是多态关联。也许您可以使用 ContentTypes 框架解决 Django 的泛型关系问题。

    【讨论】:

    • 我想我只是在谷歌上搜索了错误的词:),非常感谢,我可以处理这个。
    【解决方案2】:

    外键是 TWO 表之间的引用约束,因此您真的不能让一列引用 3 个不同表上的 3 列。

    见:http://en.wikipedia.org/wiki/Foreign_key

    你冷得让它有点不同,我相信代码将是最好的演示:

    class Category(models.Model):
      TYPES = (
        ('audio', 'audio'),
        ('overlay', 'overlay'),
        ('html', 'html'),
      )
      type = models.CharField(choices=TYPES)
    
    class Audio(models.Model):
      category = models.OneToOneField(Category)
      additional_column_for_audio = models. ...
      #...
    # same for overlay and html
    
    class Item(models.Model):
      # id is automatically added
      category = models.ForeignKey(Category)
    

    然后您可以遍历项目并执行以下操作:

    {% for item in items %}
      {% if item.category.type == "audio" %}
         {{ item.category.audio.additional_column_for_audio }}
      {% endif %}
    {% endfor %}
    

    【讨论】:

    • MySQL 和 postgres 现在都支持多表关系。我可以用普通的 sql 来做到这一点,这是我在 django 中遇到问题的方法。我喜欢你的解决方案,但它不像我希望使用的那样优雅。
    【解决方案3】:

    我最终做的是使用这个: http://docs.djangoproject.com/en/1.0/topics/db/models/#id7

    在此之前,我使用了在类中定义的另一个方法,该方法需要 2 个外键,它们只是将字段字典映射到它们的类并返回该对象类型。

    【讨论】:

      猜你喜欢
      • 2012-03-05
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2019-08-01
      • 1970-01-01
      相关资源
      最近更新 更多