Django:如何为继承的父模型创建动态的related_name?

时间:2018-08-30 17:09:09

标签: python django python-3.x django-models django-views

我有4个型号:

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)

在这里,A与{strong> User 有一个ForeignKey关系,而与u_a则有相反的关系。但是 B C A 的子代。

所以在我看来,好像不重复您的代码一样。如何克服这个问题?

1 个答案:

答案 0 :(得分:0)

要变通解决此问题,在您的模型class A(models.Model)中,该值的一部分应包含'%(app_label)s' 和/或 '%(class)s'。参见doc

'%(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)