如何在Django中过滤属性

时间:2017-01-07 03:16:51

标签: python django

我目前无法过滤数据。

模型

class Member(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    team_id = models.UUIDField(null=True)
    username = models.CharField('', max_length=30)
    is_active = models.BooleanField(default=False)

    @property
    def organization_id(self):
        """This is to get the organization Id
        """
        team = Team.objects.get(pk=self.team_id)
        return team.organization_id

现在我计划使用organation_id = 1 过滤所有成员。

这就是我需要的:

memberList = Member.objects.filter(organization_id='1')

所以我收到了这个错误:

Cannot resolve keyword 'organization_id' into field. Choices are: id, is_active, team_id, username

如何使用organization_id过滤成员?

3 个答案:

答案 0 :(得分:1)

您在模型成员中没有任何名为organization_id的字段,这就是错误原因。

你可能想要这个:

result_list = []
memberList = Member.objects.all()

for item in memberList :
    if item.organization_id() == '1' :
        result_list.append(item)

print result_list 

结果列表 result_list 将包含模型成员的所有必需对象。

感谢。

答案 1 :(得分:0)

根据我对你的问题的理解,我认为你有两个模特课。

让我们举个例子

class Organization(models.Model):
    name = models.CharField(max_length=30)

class Member(models.Model):
    username = models.CharField(blank=True, max_length=30)
    team = models.ForeignKey(Organization)

您使用UUIDField作为主键。我省略了它。 Django自动创建主键字段。我很好奇你首先使用UUID Field的目的是什么。

无论如何,如果您是第一次创建组织。 PK号码为1。

假设您正在使用python shell进行测试

python manage.py shell
>> import your models
>> Organization.objects.create(name="test1")

然后您可以使用外键关系连接此组织。

>> organization = Organization.objects.get(name="test1")
>> Member.objects.create(username="bob", team=organization)

下次如果您想获得test1组织中的成员。

>> organization = Organization.objects.get(name="test1")
>> Member.objects.filter(team=organization)

或者只是把组织'test1'的PK号。我们说它是1

>> Member.objects.filter(team=1)

如果修复了您只想获得组织为“1”的成员,则可以在模型中添加自定义管理器。

class OrganizationManager(models.Manager):
    def get_queryset(self):
        return super().get_queryset().filter(team=1)

class Organization(models.Model):
    name = models.CharField(max_length=30)

class Member(models.Model):
    username = models.CharField(blank=True, max_length=30)
    team = models.ForeignKey(Organization)

    objects = models.Manager()
    organization = OrganizationManager()

您可以获得以下成员

>> Member.organization.all()

它将返回组织pk 1中的成员。

答案 2 :(得分:0)

memberList = Member.objects.all().annotate(org_id=F('calculate organization id over other model fields')).filter(org_id='1')

在我的情况下,这有帮助,有F是

from django.db.models import F