python - Django: How to create a dynamic related_name for an inherited parent model?
问题描述
I have 4 models:
class User(models.Model):
name = models.CharField(max_length=255)
class A(models.Model):
user= models.ForeignKey("User", related_name="u_a", on_delete=models.CASCADE)
title = models.CharField(max_length=255)
class B(A):
user= models.ForeignKey("User", related_name="u_b", on_delete=models.CASCADE)
#isn't the code repeated???
b_field = CharField(max_length=255)
class C(A):
user= models.ForeignKey("User", related_name="u_c", on_delete=models.CASCADE)
#isn't the code repeated???
c_field = CharField(max_length=255)
Here, A has a ForeignKey
relationsip with User and a reverse relationship as u_a
. But B and C are children of A.
So It appears to me as if Do not repeat your code is violated. How to overcome this?
解决方案
要解决此问题,在您的模型class A(models.Model)
中,值的一部分应包含'%(app_label)s'
和/或 '%(class)s'
。看文档
'%(class)s'
替换为使用该字段的子类的小写名称。
'%(app_label)s'
替换为包含子类的应用程序的小写名称。每个安装的应用程序名称必须是唯一的,并且每个应用程序中的模型类名称也必须是唯一的,因此生成的名称最终会有所不同。
class A(models.Model):
user= models.ForeignKey("User", related_name="%(class)s_set",
on_delete=models.CASCADE)
#user= models.ForeignKey("User", related_name="%(app_label)s_%(class)s_set",
#on_delete=models.CASCADE)
title = models.CharField(max_length=255)
class B(A):
b_field = CharField(max_length=255)
class C(A):
c_field = CharField(max_length=255)
推荐阅读
- axapta - D365 x++ 上的查找过滤
- c# - 如何更改在c#中选中的默认单选按钮
- python - 生成具有较大上限的随机数
- java - Vaadin 14 组合框错误:“服务器连接丢失,正在尝试重新连接......”
- vb.net - 从 Access 文件到 DataTable 的数据检索不起作用
- javascript - 将数字数组转换为日历视图
- java - 使用公共 wss (Java) 获取 websocket 数据
- python - 更新 Seaborn 后 Python 无法启动
- java - java如何用char数组实现我的对象类到一个主类
- postgresql - pgbouncer 抛出 Pooler Error: Auth Failed when using datagrip but not when using pgadmin