Django查询-选择位置

时间:2018-07-30 02:47:28

标签: python django python-3.x django-models django-queryset

我有一个ClientUsersClientUsersAssignment表。客户端被分配给另外一个用户。

我需要检索给定用户有权访问的客户端列表。如何构造过滤器?

我在下面的代码段中包含了SQL等效项。

Client.objects.filter ( 
    # SQL Equivalent Statement
    WHERE request.user.id IN (SELECT user FROM ClientStaffAssignment WHERE clientid = client.id)
)

还有django模型的完整性:

class User(models.Model):

  id              = models.AutoField(primary_key=True)
  username        = models.CharField(max_length=50, unique=True)
  password        = models.CharField(max_length=50, blank=True, null=True)

class Client(models.Model):

  id             = models.AutoField(primary_key=True)
  first_name     = models.CharField(max_length=100)
  last_name      = models.CharField(max_length=100, blank=True, null=True)

class ClientStaffAssignment(models.Model):

  id             = models.AutoField(primary_key=True)
  client         = models.IntegerField(blank=True, null=True)
  user           = models.ForeignKey (User, blank=True, null=True)

2 个答案:

答案 0 :(得分:0)

ClientUser在这种情况下具有多对多关系,因此您应使用Client来定义UserManyToManyField

class Client(models.Model):
    first_name = models.CharField(max_length=100)
    last_name = models.CharField(max_length=100, blank=True, null=True)

class User(models.Model):
    username = models.CharField(max_length=50, unique=True)
    password = models.CharField(max_length=50, blank=True, null=True)
    clients = models.ManyToManyField(Client)

这样您可以轻松获取给定用户分配给的客户的列表:

for user in User.clients.all():
    print(user)

请阅读Many-to-many relationships documentation

附带说明,id字段是为每个模型自动生成的,因此您不必显式定义它。

答案 1 :(得分:0)

好的,这里的密钥是在ManyToManyField模型上添加Client并确保在中间(ClientStaffAssignment)模型上设置了外键。有了这个,过滤器就非常简单。 Reference on intermediary many-to-many relationships

查询集

Client.objects.filter( assigned_staff=request.user )

修改后的模型

class User(models.Model):

  id              = models.AutoField(primary_key=True)
  username        = models.CharField(max_length=50, unique=True)
  password        = models.CharField(max_length=50, blank=True, null=True)


class Client(models.Model):

  id             = models.AutoField(primary_key=True)
  first_name     = models.CharField(max_length=100)
  last_name      = models.CharField(max_length=100, blank=True, null=True)
  assigned_staff = models.ManyToManyField(User, through='ClientStaffAssignment')


class ClientStaffAssignment(models.Model):

  id             = models.AutoField(primary_key=True)
  client         = models.ForeignKey(Client, blank=True, null=True)
  user           = models.ForeignKey(User, blank=True, null=True)