我有以下模型:

class Foo(models.Model):
    some_field = models.CharField()
    class Meta:
        pass

class Bar(Foo):
    some_other_field = models.CharField()
    class Meta:
        pass


该示例已简化,实际上两个模型都有很多领域。

当我查询Bar时,Django ORM创建一个包含Foo内部联接的查询。
我不需要Foo中的信息。

问题:是否可以在不与Foo进行内部联接的情况下查询Bar?

我意识到,删除Bar扩展Foo并将其设置为外键将是解决此问题的更好方法。但是,有很多遗留代码依赖于此,因此在没有时间和胆量来重构应用程序的遗留部分之前,我希望使用快速解决方案。

我也意识到我可以自己编写一个SQL查询,但是我更喜欢使用ORM的解决方案。

最佳答案

我这样做的方法是为此实例使用新的非托管模型

class SkinnyBar(models.Model):
    some_other_field = models.CharField()

    class Meta:
        managed = False
        db_table = "app_bar"


这将允许您使用ORM。

如果要避免重复,可以尝试将大多数属性和方法添加到元类

class BaseBar(models.Model):
    some_other_field = models.CharField()

    def some_common_method(self):
        return True

    class Meta:
        abstract = True


class Bar(BaseBar, Foo):

    def some_method_that_requires_foo(self):
        return self.some_field == 1


class SkinnyBar(BaseBar):

    class Meta:
        managed = False
        db_table = "app_bar"

08-18 04:53
查看更多