繁体   English   中英

Django Abstract Models使用下划线设置related_name

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM