我可以在python中删除查询集的项目但不删除数据库上的该项目吗?

时间:2015-06-11 16:56:09

标签: python django-queryset

我正在django中创建一个应用程序,我有下一个问题:

我使用下一个命令行获得queryset

queryset = Persons.objects.all()

假设结果列表是下一个:['x', 'y', 'z']

我想删除该列表中的元素x,以便生成的列表为:['y', 'z']

我不想删除元素x。所以我不能使用命令item.delete()

如果我的模特是:

class A(models.Model):
    att1= models.ForeignKey(B)
    att2 = models.CharField(max_length=128)
...

class B(models.Model):
    ident = models.CharField(max_length=128)
...

如何获得与A和A.att2值相关的B对象的查询集=='test'???

3 个答案:

答案 0 :(得分:1)

例如:

# we usually don't import User directly
# but I just wanted to show how to use exclude
from django.contrib.auth import User
User.objects.all()  # will return all users
# will return exxactly the same queryset
# except that the user with the `admin` username
# will be excluded from the queryset.
User.objects.all().exclude(username='admin')

如果您有一些相关字段,例如:

class Item(models.Model):
    user = models.ForeignKey('User')
    value = models.CharField(max_length=128)

您可以排除某些用户拥有' admin'用户名。 您可以使用exclude功能。

Item.objects.exclude(user__username='admin')

答案 1 :(得分:1)

我认为您需要设置related_name:

class A(models.Model):
    att1= models.ForeignKey(B, related_name='A_model')
    att2 = models.CharField(max_length=128)

class B(models.Model):
    ident = models.CharField(max_length=128)
像这样查询:

B.objects.filter(A_model__att2="test")

这是我在stackoverflow中的第一个答案,希望这能帮到你

如果您不想设置related_name,请尝试:

B.A_set.filter(att2="test")

答案 2 :(得分:0)

或者您可以创建另一个字段

在模型中如下:

class Persons(model.Models):
    name = models.CharField(max_length=100)
    is_active = models.BooleanField(default=True)

给x一个" is_active" =假

x1 = Persons.objects.get(name='x')
x1.is_active = False
x1.save()

现在您可以像这样过滤:

queryset = Persons.objects.filter(is_active=True)