如何在 Django 中使用动态外键?

Posted

技术标签:

【中文标题】如何在 Django 中使用动态外键?【英文标题】:How to use dynamic foreignkey in Django? 【发布时间】:2010-10-27 06:39:07 【问题描述】:

我想将一个ForeignKey 连接到两个不同的模型。

例如:

我有两个名为 CastsArticles 的模型,以及第三个模型 Faves,用于偏爱其他模型。如何使ForeignKey 动态化?

class Articles(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()

class Casts(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()

class Faves(models.Model):
    post = models.ForeignKey(**---CASTS-OR-ARTICLES---**)
    user = models.ForeignKey(User,unique=True)

这可能吗?

【问题讨论】:

有人可以查看***.com/q/52999216/9997156吗 【参考方案1】:

这是我的做法:

from django.contrib.contenttypes.models import ContentType
from django.contrib.contenttypes import fields


class Photo(models.Model):
    picture = models.ImageField(null=True, upload_to='./images/')
    caption = models.CharField(_("Optional caption"),max_length=100,null=True, blank=True)

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = fields.GenericForeignKey('content_type', 'object_id')

class Article(models.Model):
    ....
    images     = fields.GenericRelation(Photo)

你会添加类似的东西

    content_type = models.ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = fields.GenericForeignKey('content_type', 'object_id')

致最爱 和

    fields.GenericRelation(Faves)

到文章和演员

contenttypes docs

【讨论】:

【参考方案2】:

这是一种方法。 (注意模型是单数的,Django 会自动为你复数。)

class Article(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()

class Cast(models.Model):
    title = models.CharField(max_length=100)
    body = models.TextField()

FAVE_CHOICES = ( 
    ('A','Article'),
    ('C','Cast'),
)
class Fave(models.Model):
    type_of_fave = models.CharField( max_length=1, choices=FAVE_CHOICES )
    cast = models.ForeignKey(Casts,null=True)
    article= models.ForeigKey(Articles,null=True)
    user = models.ForeignKey(User,unique=True)

这很少会带来严重的问题。它可能需要一些巧妙的类方法,具体取决于您的用例。

【讨论】:

+1 我认为通用内容类型(如已接受的答案)更适合您对关系一无所知的“可插入”模型。对于您可以控制并完全了解所有模型的情况,您的答案会更好。更好意味着更容易编写查询并减少对数据库的访问。 您在演员表和文章 FK 字段 args 中忘记了“null=True”,因为每个 Fave 实例不会将一个 FK 字段设置为与 type_of_fave 字段中的设置相对应的 None

以上是关于如何在 Django 中使用动态外键?的主要内容,如果未能解决你的问题,请参考以下文章

如何在不同的数据库中使用带有外键的 django 模型?

django模型,如何动态设置查询的字段?

django:如何从包含外键的多个模型中制作一个表单

如何使用 Django 模型在 ExtJS 网格中获取外键值而不是键?

如何借助一对多关系在 Django 中使用外键从课程中获取主题

如何在django中上传csv文件的函数中使用外键连接模型?