Django使用两个值过滤on属性,结果更倾向于on

2024-06-28 20:43:08 发布

您现在位置:Python中文网/ 问答频道 /正文

这是一个奇怪的问题,所以提前道歉。我在Django Rest中有一个模型是这样的:

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()

我有一个ViewSet,它需要返回一个给定的{request_barId,request_buzzId,lastUpdateDate}的所有foo的列表。这很简单

^{pr2}$

问题就在这里。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

这看起来真的很刺耳。有没有办法把它清理干净?在

EDIT:为了澄清,假设元组{1,0,'01-01-1970'}的列表表示基集(buzzId:0),并返回包含fizzid{1,2,3,10}的对象列表。假设元组{1,1,'01-01-1970'}表示某个buzzId对完整字符串集的请求。如果我们说buzzId为1(称为augment)的Foos与fizzid{2、10、15、20}匹配,那么结果集应该如下所示

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

这能澄清吗?在


Tags: falsetrue列表basedatemodelsrequestclass
1条回答
网友
1楼 · 发布于 2024-06-28 20:43:08

可以使用^{}组合成一个语句:

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

另外,请在将来格式化所有代码。它不一定要像我,但它绝对有助于阅读你的问题。在

相关问题 更多 >