Django ORM:覆盖子类中Field的related_name

gue*_*tli 7 django django-models

我得到这个例外:

django.core.exceptions.FieldError:

"SpecialPlugin"类中的本地字段"ticket"与基类"BasePlugin"中类似名称的字段发生冲突

这是我的模特:

class BasePlugin(models.Model):
    ticket = models.OneToOneField('foobar.ticket', primary_key=True, 
                                  related_name='%(app_label)s_%(class)s')

    class Meta(IndexImplementation.Meta):
        abstract = True

    # .. Other stuff which should be available for SpecialPlugin 
    #    and other child classes.

class SpecialPlugin(BasePlugin):
    ticket = models.OneToOneField('foobar.ticket', primary_key=True, 
                                  related_name='special')
Run Code Online (Sandbox Code Playgroud)

我只发现了这个注释,但在我的例子中,父类是抽象的.我不确定它是否适用于此.

我想给子类提供SpecialPlugin相关的名称"special",因为%(app_label)s_%(class)sBasePlugin 的相关name()会破坏旧代码.

有没有办法给SpecialPlugin.ticket相关的"特殊"?

v1k*_*k45 10

它可能看起来像一个丑陋的黑客,但你可以设置一个函数调用default_related_name参数而不是字符串.然后在子类/模型中覆盖该函数.

class BasePlugin(models.Model):

    @staticmethod
    def get_ticket_related_name():
        return '%(app_label)s_%(class)s'

    ticket = models.OneToOneField('foobar.ticket', primary_key=True, 
                                  related_name=get_ticket_related_name.__func__())

    class Meta(IndexImplementation.Meta):
        abstract = True


class SpecialPlugin(BasePlugin):
    @staticmethod
    def get_ticket_related_name():
        return 'special'
Run Code Online (Sandbox Code Playgroud)

  • 我的子类中的get_ticket_related_name从未被调用。 (3认同)