0

这是一个奇怪的问题,很抱歉提前。我在Django的楷模,看起来像这样:Django过滤属性有两个值,更喜欢一个的结果

class BaseModel(models.Model): 
    created_date = models.DateTimeField(auto_now_add=True) 
    modified_date = models.DateTimeField(auto_now=True) 

    class Meta: 
     abstract = True 

class Foo(BaseModel): 
    barId = models.ForeignKey(Bar, unique=False) 
    fizzId = models.ForeignKey(Fizz, unique=False) 
    buzzId = models.IntegerField(unique=False) 
    value = models.TextField() 

而且我有一个需要返回具有给定{request_barId,request_buzzId,LASTUPDATEDATE}所有FOOS列表的视图集。这是相当直接的,

foobar = Foo.objects.filter(
buzzId=request_buzzId, 
modified_date__gt=request_lastUpdateDate, 
barId=request_barId) 

这是蹭。 buzzId的缺省值是指定buzzId需要覆盖的基本列表,替换基本列表上的实例。这就是我有点失落的地方。我有一个解决方案,但我觉得它不是特别优雅,而且有一种方法可以做到这一点。这里是我的代码做覆盖:

base_foobar = Foo.objects.filter(
buzzId=base_buzzId, 
modified_date__gt=request_lastUpdateDate, 
barId=request_barId).exclude(
     fizzId__in=[o.fizzId for o in foobar]) 
result = foobar | base_foobar 

而这看起来真的很junky。有没有办法清除它?

编辑:为了澄清,让我们假设元组{1,0,'01 - 01-1970'}的列表表示基本集合(buzzId:0),并返回包含fizzIds {1 ,2,3,10}。假设元组{1,1,'01 -01-1970'}表示buzzId对一组完整字符串的请求。如果说,我们的1 buzzId(称之为扩充)已经匹配FOOS与fizzIds {2,10,15,20},然后我们的结果集应该像

{ (base) 1, (augment) 2, (base) 3, (augment) 10, (augment) 15, (augment) 20 } 

这是否清晰起来?

+0

您能否详细说明并更新您的问题: “buzzId有一个默认值,它是指定buzzId需要覆盖的基本列表,替换基本列表上的实例。” –

+0

@DhruvBaveja更新。 – Duckies

回答

0

你可以使用Q结合成一个语句:

result = (Foo.objects 
    .filter(
     Q(
      modified_date__gt=request_lastUpdateDate, 
      barId=request_barId 
     ) 
     & 
     (
      Q(buzzId=request_buzzId) 
      | 
      (
       Q(buzzId=base_buzzId) 
       & 
       ~Q(fizzId__in=[o.fizzId for o in foobar]) 
      ) 
     ) 
    ) 
    .order_by('-buzzId' if request_buzzId < base_buzzId else 'buzzId') 
    )[0] # fetch first result only 

另外,请格式化所有的代码的未来。它不一定像我一样,但它肯定会帮助你阅读你的问题。

+0

对格式化道歉;我试图修复它在编辑器中,我想编辑搞砸了或什么的。我会解决它。也会尝试你的解决方案,谢谢! – Duckies

+0

没有问题,我看你是新手:-)如果解决方案有帮助,就投票吧。如果它可行,请投票并接受它:-) –

+0

所以我现在的解决方案确实有效。我想知道你能否解释为什么这个解决方案比我列出的更好?它是否优化了查询,还是有我失踪的效率? – Duckies

相关问题