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

7 浏览
0 Comments

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

我想将一个单一的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或Articles---**)
    user = models.ForeignKey(User,unique=True)

这种可能吗?

0
0 Comments

问题的原因是在Django中如何使用动态外键。在给出的代码中,有三个模型:Article、Cast和Fave。Fave模型中有一个type_of_fave字段,用于指示喜爱的类型(A代表Article,C代表Cast),还有一个cast字段和一个article字段,用于存储外键关联的Cast和Article模型的实例。然而,这种动态外键的实现可能会遇到一些问题。

解决方法是在cast字段和article字段的参数中添加null=True。这是因为每个Fave实例只会将type_of_fave字段对应的一个FK字段设置为None。

在实际应用中,如果我们对所有模型都有完全的控制和了解,使用动态外键可能更好。这样可以更容易地编写查询并减少对数据库的访问次数。然而,如果我们的模型是可插拔的,并且我们不知道关系的具体细节,那么使用通用内容类型可能更好。这样可以更灵活地处理不同类型的关联关系。

0
0 Comments

在Django中使用动态外键的原因是为了实现通用关系模型。这种模型可以与任何其他模型建立关联,并且可以根据需要动态更改关联的模型。

解决方法是使用Django的contenttypes模块和GenericForeignKey字段。首先,我们需要导入ContentType和fields模块。然后,在Photo模型中添加content_type和object_id字段,分别表示关联模型的类型和ID。接下来,使用GenericForeignKey字段来建立与关联模型的动态关系。最后,在Article模型中使用GenericRelation字段来建立与Photo模型的关联。

下面是具体的代码示例:

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)

在上述代码中,我们定义了Photo模型,其中包含了一个图片字段和一个可选的标题字段。此外,我们还添加了content_type和object_id字段,并使用GenericForeignKey字段建立了与其他模型的动态关联。接着,我们定义了Article模型,并使用GenericRelation字段建立了与Photo模型的关联。

通过以上的代码实现,我们可以实现在不修改模型结构的情况下,动态地与其他模型建立关联。具体的使用方法和更多细节可以参考Django官方文档中的contenttypes模块相关内容。

参考链接:[contenttypes docs](https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations)

0