繁体   English   中英

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

[英]Django ORM query: how to swap value of a attribute?

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

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)[:]

变体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)

这是我想到的:

如果在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()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM