如何扩展django中的Site模型?

14 投票
7 回答
5331 浏览
提问于 2025-04-15 22:38

在Django中,扩展Site模型的最佳方法是什么?是创建一个新模型并用外键关联Site,还是有其他方法可以让我继承Site模型?

我更喜欢继承,因为这样在关系上我会更自在,但我担心这会对内置的管理界面产生影响。

7 个回答

4

如果你只想改变对象的行为,而不想添加新的字段,可以考虑使用“代理模型”(在Django 1.1中新增的功能)。你可以给现有的模型添加额外的Python方法,还有更多的功能:

这就是代理模型继承的目的:为原始模型创建一个代理。你可以创建、删除和更新代理模型的实例,所有的数据都会像使用原始(非代理)模型一样被保存。不同之处在于,你可以在代理中改变一些设置,比如默认的模型排序或默认的管理器,而不需要去修改原始模型。

想了解更多,可以查看文档

5

到目前为止,在Django 2.2中,扩展Site并没有像扩展User那样简单。现在最好的办法是创建一个新的实体,把你需要的参数放在那里。如果你想利用现有的网站支持,这是唯一的办法。

class SiteProfile(models.Model):
    title = models.TextField()
    site = models.OneToOneField(Site, on_delete=models.CASCADE)

你需要为SiteProfile创建一个管理界面。然后添加一些与Site关联的SiteProfile记录。现在你可以在任何可以访问当前网站的模型中使用site.siteprofile.title

9

我刚刚使用自己定义的Site子类,创建了一个自定义的管理界面。

简单来说,当你在Django中对一个模型进行子类化时,它会创建一个外键(FK),指向父模型,并且可以像访问父类的属性一样,透明地访问父模型的字段。内置的管理界面不会受到影响,但你需要取消注册Sites的ModelAdmin,然后注册你自己的ModelAdmin。

撰写回答