[英]Django Abstract Models setting related_name with underscores
我有一个抽象基础模型和2个继承模型,我需要强制related_name采用特定格式。
class Animal(models.Model):
legs = models.IntegerField(related_name='%(class)s')
habitat = models.ForeignKey(Habitats, related_name='%(class)s')
class DogAnimal(BaseModel):
name = models.CharField(max_length=20, related_name='dog_animal')
class CatAnimal(BaseModel):
name = models.CharField(max_length=20, related_name='cat_animal')
通常,related_name ='%(class)s'将分别导致catanimal和doganimal。
我需要像这样强调的值:dog_animal,cat_animal
以下是“为什么”我需要这样做 - 遗产。 这些模型没有使用基类组织 - 因此最初指定的related_name是'dog_animal'和'cat_animal'。 改变这将是很多工作。
解决方案可能不是为habitat
指定related_name
并为所有子项定义default_related_name
:
class Animal(models.Model):
class Meta:
abstract = True
habitat = models.ForeignKey(Habitats, on_delete=models.CASCADE)
class DogAnimal(Animal):
class Meta:
default_related_name = 'dog_animal'
class CatAnimal(Animal):
class Meta:
default_related_name = 'cat_animal'
它需要一些调整,但我认为你可以通过覆盖ForeignKey
类来做到这一点:
from djang.utils.text import camel_case_to_spaces
class MyForeignKey(models.ForeignKey):
def contribute_to_class(self, cls, *args, **kwargs):
super().contribute_to_class(cls, *args, **kwargs)
related_name = self.remote_field.related_name
if not cls._meta.abstract and related_name:
underscore_name = camel_case_to_spaces(cls.__name__).replace(' ', '_')
self.remote_field.related_name = related_name.format(underscore_name=underscore_name)
class Animal(models.Model):
class Meta:
abstract = True
habitat = MyForeignKey(Habitats, on_delete=models.CASCADE, related_name='{underscore_name}')
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.