Django ORM
精选
原创
©著作权归作者所有:来自51CTO博客作者古兮月兮的原创作品,请联系作者获取转载授权,否则将追究法律责任
related_name
概述
[官方链接](模型字段参考 | Django 文档 | Django (djangoproject.com))
官方的一段话描述的很清楚:
用于从相关对象到这个对象的关系的名称。这也是 related_query_name 的默认值(用于从目标模型反向过滤名称的名称)。请参阅 关联对象文档 以获得完整的解释和示例。请注意,当你在 抽象模型 是可用的。
如果你不希望 Django 创建一个反向关系,可以将 related_name 设置为 '+' 或者以 '+' 结束。例如,这将确保 User 模型不会与这个模型有反向关系:
- 模型间反向查找(这里一对多和多对多,个人感觉是非常好用的)
- 非必填,默认为模型名称“小写”
问题
案例:为每个模型增加 create_user, update_user。每个模型都写?(个人感觉非常low)。还是写一个继承类?
分析
django默认生成related_name
django对没有传入的related_name,生成一个,大概看了下。没有思路,参照Pyhton类属性的使用。没有时间去搞,有时间可以看看...未完待续
django 官方的 API
[官方链接](模型 | Django 文档 | Django (djangoproject.com))
from django.db import models
class Base(models.Model):
m2m = models.ManyToManyField(
OtherModel,
related_name="%(app_label)s_%(class)s_related",
related_query_name="%(app_label)s_%(class)ss",
)
class Meta:
abstract = True
class ChildA(Base):
pass
class ChildB(Base):
pass
因此
class UpdateCreateUser(models.Model):
update_user = models.ForeignKey(
'account.User', on_delete=models.SET_NULL, db_constraint=False, related_name='update_user_%(class)s',
verbose_name='更新人', null=True, blank=True
)
create_user = models.ForeignKey(
'account.User', on_delete=models.SET_NULL, db_constraint=False, related_name='create_user_%(class)s',
verbose_name='创建人', null=True, blank=True
)
class Meta:
abstract = True
每个类中去继承此类即可。
延伸
在保存时,个人感觉拆出来逻辑比较好。graphene_python。此功能,应该是可以想想装饰器的方式去实现。但是,项目是后期增加,需要做一些配合,因此这里使用调用方式解决。
@classmethod
def update_user(cls, obj, user):
obj.update_user = user
obj.save()
@classmethod
def created_user(cls, obj, user):
obj.create_user = user
obj.save()
总结
Django 模型是最好用的ORM没有之一。有问题可以去官方文档看看,各种搜不一定能解决问题。找到此类方法,应该能获取一些思路。
更新
文档归类为 Django ORM下,个人感觉可以记录问题都将更新到这里。