2011-05-10 70 views
0

我有一个模型(补丁)它有一个作者字段,我需要生成几个报告,总是过滤出作者不包含字符串'@ example.com'的行。鉴于补丁是在一个单独的django应用程序中定义的,我不想更改,我的想法是创建一个DB视图(例如,ExampleComPatch,使用非托管模型类访问),可以过滤掉所有行我不感兴趣,然后将报告方法放在新模型类下。如何将所有字段定义从一个模型类复制到另一个模型类?

为了避免代码重复,我让我的新模型类从Patch继承。这工作正常,只有一对夫妇的注意事项:

  1. 我认为需要有一个额外的“patch_ptr_id”一个在补丁中定义的所有列加,因为Django的认为我想真正的继承在DB以及
  2. 由于这是一个非管理模型类,使用该视图中的测试需要创建手动

然而,由于Django的认为我想真正的继承,每当我删除补丁的一个实例,它结束了贯通进入其所有子对象(例如,连接到它的ExampleComPatch中的行),这意味着与ExampleComPatch无关的测试现在可以是n如果需要从修补程序表中删除()行,则需要手动创建数据库视图。我想继承可能不是最好的选择,但我真的想避免代码重复,所以我想知道是否有办法将所有字段定义从Patch复制到ExampleComPatch。或者,甚至可能采用完全不同的方法,使我可以使用数据库视图(以降低报告方法的复杂性)和在补丁之外定义的报告方法,因为它们在那里没有多大意义。

回答

1

代理模型是您的票。事情是这样:

from somewhere import Patch 

class FilteredPatchManager(models.Manager): 
    def get_query_set(self, *args, **kwargs): 
     return super(FilteredPatchManager, self).get_query_set().exclude(author__contains='@example.com') 


class FilteredPatch(Patch) 
    objects = FilteredPatchManager() 

    class Meta: 
     proxy = True 

然后,使用FilteredPatch.objects进行查询,而不是Patch.objects

+0

这正是我想要的;不能相信我没有注意到关于继承的文档。谢谢! – 2011-05-10 21:18:00

0

我认为你让事情比他们需要的复杂得多。如果我理解正确的话,你想从一些标准的GET查询排除某些对象 - 如果是这样的话,你应该看看

Modifying initial Manager QuerySets

基本上,你可以自定义得到的查询返回,就像这样:

# First, define the Manager subclass. 
class PatchManger(models.Manager): 
    def get_query_set(self): 
     return super(PatchManager, self).get_query_set().exclude(author__contains='@example.com') 

# Then hook it into the Patch model explicitly. 
class Patch(models.Model): 
    author = models.CharField(max_length=100) 

    objects = PatchManager() # The custom manager. 

希望我理解正确你的问题......

干杯,

马丁

+0

这正是我想要编写的报告方法的要求,但不是针对修补程序中的所有现有方法,因此它不起作用。另外,正如我所说,Patch是在一个单独的django应用程序,我不能改变,所以我想在一个单独的模型类(它的子类,在数据库级过滤似乎是最好的选择)。还是)感谢你的建议。 – 2011-05-10 20:51:52

0

为什么您需要继承或复制代码?您可以将模型导入当前应用程序并在必要时进行筛选 - 如果您愿意,可以在应用程序中创建一个封装筛选器的函数,因此您只需调用该函数即可返回筛选出的实例。

+0

我不希望的事情之一是不得不在多个地方进行筛选,所以通过在尽可能低的级别(DB)进行筛选,我不必在任何报告方法中进行筛选。这就是为什么我使用数据库视图进行访问的原因,但是由于模型类具有与现有视图完全相同的字段,因此我想在它们之间共享该代码。 – 2011-05-10 20:46:19

相关问题