首页 > 解决方案 > 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?

标签: pythondjangopython-3.xdjango-modelsdjango-views

解决方案


要解决此问题,在您的模型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)

推荐阅读