我有以下模型:
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"