Django: Как создать динамическое related_name для унаследованной родительской модели? - PullRequest
0 голосов
/ 30 августа 2018

У меня 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 имеет отношение ForeignKey с Пользователь и обратную связь как u_a. Но B и C являются детьми A .

Так мне кажется, будто не повторяешь, твой код нарушен. Как это побороть?

1 Ответ

0 голосов
/ 30 августа 2018

Чтобы обойти эту проблему, в вашей модели 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)
...