Django中抽象模型之间的关系

时间:2021-02-28 07:39:50

标签: django django-models

有没有办法创建基本抽象模型并在它们之间实现某种假关系,而不是在每个继承的真实模型中重新定义相同的关系? 我制作了这个 models.py 用于测试目的:

from django.contrib.contenttypes.models import ContentType
from django.db import models


class BaseSource(models.Model):
    source_field = models.CharField(max_length=10, null=True)
    source_field1 = models.IntegerField(default=0)

    pointers = GenericRelation('BasePointer')

    class Meta:
        abstract = True

    def print_pointers(self):
        for pointer in self.pointers.all():
            print(pointer.pointer_field)


class BasePointer(models.Model):
    pointer_field = models.CharField(max_length=10, null=True)

    class Meta:
        abstract = True

    source_type = models.ForeignKey(ContentType, on_delete=models.CASCADE)
    source_id = models.PositiveIntegerField()
    source = GenericForeignKey(source_type, source_id)


class Source(BaseSource):
    pass


class Source2(BaseSource):
    pass


class Pointer(BasePointer):
    source = models.ForeignKey(Source, related_name='pointers', on_delete=models.CASCADE)


class Pointer2(BasePointer):
    source = models.ForeignKey(Source2, related_name='pointers', on_delete=models.CASCADE)

原因是提供了一种根据用户的选择切换当前模型(Source+Pointer 和 Source2+Pointer2)的方法,模型将大体相同,略有不同,所以我不想让它们完全不同的类. 大多数字段和逻辑在基本抽象模型中描述,实际模型使用数据库中的不同表,如果需要,视图将确定当前模型集并提供特定的上下文变量。 问题在于这些模型之间的关系:示例方法 - print_pointers,它使用未声明的字段 self.pointers。我尝试将 GenericRelation('BasePointer') 声明为假关系,但由于错误而无法迁移它: test_models.Source2.pointers: (fields.E307) The field test_models.Source2.pointers was declared with a lazy reference to 'test_models.basepointer', but app 'test_models' doesn't provide model 'base pointer'.

我现在找到的最好方法是声明真实模型中的所有关系并忽略未解析的属性引用(例如指针)的 IDE 警告。有没有更好的解决办法? 提前致谢,对不起我的英语))

0 个答案:

没有答案
相关问题