情况就是这样。我想交换用户的价值。
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)[:]
答案 0 :(得分:1)
我认为CharField
有fruit
。然后将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)
为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()