Python Django ORM查询:如何交换属性的值?
情况就是这样。我想交换用户的值Python Django ORM查询:如何交换属性的值?,python,django,orm,django-queryset,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很懒吧 那么,我可以问一下,我如何执行这种“交换”操作?我
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\u with_pear=user.objects.filter(fruit=pear)[:]我想到的是: 如果在查询集中调用
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()
变式1
我想你有CharField
作为水果
。然后将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_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)
嘿,谢谢你的回答,伙计!我想它会起作用的。但是在这种情况下,我必须分别调用它们中的每一个,对吗?这是不是意味着我要花很多时间打db@施泰纳那可能是对的。我不认为这会产生额外的数据库调用。@nooooob是的,每次你调用
save()
db doupdate
@donotarestme与使用update
?@donotarestme有什么不同吗?@donotarestme我不认为在切片或调用list()之后我可以使用update():(谢谢你的回答!@donotarestme!这感觉像是经典的“切换2整数的值”解决方案,只命中数据库3次。嗯,我会尝试一下。@nooooob不客气!是的。如果你需要性能-这只是django orm后面的3update
query to db。在我的情况下,太糟糕的结果不可能是空的?@nooooob好的,将它设置为其他值(不在你的数据库中),例如。FooBar@noooooooob有什么类型的水果田?