Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/278.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/334.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django ORM查询:如何交换属性的值?_Python_Django_Orm_Django Queryset - Fatal编程技术网

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 do
update
@donotarestme与使用
update
?@donotarestme有什么不同吗?@donotarestme我不认为在切片或调用list()之后我可以使用update():(谢谢你的回答!@donotarestme!这感觉像是经典的“切换2整数的值”解决方案,只命中数据库3次。嗯,我会尝试一下。@nooooob不客气!是的。如果你需要性能-这只是django orm后面的3
update
query to db。在我的情况下,太糟糕的结果不可能是空的?@nooooob好的,将它设置为其他值(不在你的数据库中),例如。FooBar@noooooooob有什么类型的水果田?