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下,个人感觉可以记录问题都将更新到这里。