如何扩展django中的Site模型?
在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。