Django ORM查询:如何交换属性的值?

时间:2014-01-21 04:46:06

标签: python django orm django-queryset

情况就是这样。我想交换用户的价值。

user_with_apple = User.objects.filter(fruit=apple)
user_with_pear = User.objects.filter(fruit=pear)

user_with_apple.update(fruit=pear)
user_with_pear.update(fruit=apple)

嗯,这不起作用,因为一切都以梨为结束。因为django ORM是懒惰的,我想?

我可以问一下如何进行这种“交换”操作?我必须使用中间值吗?

非常感谢你!

或者,如果我通过切片或调用list()强制对查询进行评估,这是否有意义? 例如。     user_with_apple = User.objects.filter(fruit = apple)[:]     user_with_pear = User.objects.filter(fruit = pear)[:]

2 个答案:

答案 0 :(得分:1)

变式1

我认为CharFieldfruit。然后将unknown选项添加到选项中。

FRUIT_CHOICES = (
    ...
    (unknown, 'Unknown'),
    (apple, 'Apple'),
    (pear, 'Pear'),
    ...
)

class User(models.Model):
    ...
    fruit = models.CharField(..., choices=FRUIT_CHOICES)
    ...

然后试一试。

User.objects.filter(fruit=apple).update(fruit=unknown)
User.objects.filter(fruit=pear).update(fruit=apple)
User.objects.filter(fruit=unknown).update(fruit=pear)

变式2

fruit字段添加访问空值。

FRUIT_CHOICES = (
    ...
    (apple, 'Apple'),
    (pear, 'Pear'),
    ...
)

class User(models.Model):
    ...
    fruit = models.CharField(..., blank=True, null=True, choices=FRUIT_CHOICES)
    ...

User.objects.filter(fruit=apple).update(fruit=None)
User.objects.filter(fruit=pear).update(fruit=apple)
User.objects.filter(fruit=None).update(fruit=pear)

答案 1 :(得分:0)

以下是我想到的:

如果在QuerySet上调用list,则强制Django为您提供对象。这样做的问题是你不能在列表上调用update,所以你需要迭代列表,并更新每个对象。

这可能会帮助您:

users_with_apple = list(User.objects.filter(fruit=apple))
users_with_pear = list(User.objects.filter(fruit=pear))

for user in users_with_apple:
    user.fruit = pear
    user.save()
for user in users_with_pear:
    user.fruit = apple
    user.save()