【发布时间】:2011-03-02 00:34:22
【问题描述】:
有没有在 Django 中模拟双外键?
例如,如果我有表格:audio、overlay、html 和表:timeline_item,它有一个字段 id,以及一个指定音频、覆盖或 html 的字段类别...
有谁知道我将如何在 Django 中进行建模?或者是否有可能?
【问题讨论】:
标签: sql django foreign-keys
有没有在 Django 中模拟双外键?
例如,如果我有表格:audio、overlay、html 和表:timeline_item,它有一个字段 id,以及一个指定音频、覆盖或 html 的字段类别...
有谁知道我将如何在 Django 中进行建模?或者是否有可能?
【问题讨论】:
标签: sql django foreign-keys
听起来像是多态关联。也许您可以使用 ContentTypes 框架解决 Django 的泛型关系问题。
【讨论】:
外键是 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 %}
【讨论】:
我最终做的是使用这个: http://docs.djangoproject.com/en/1.0/topics/db/models/#id7
在此之前,我使用了在类中定义的另一个方法,该方法需要 2 个外键,它们只是将字段字典映射到它们的类并返回该对象类型。
【讨论】: