【问题标题】:Django Query - Select WhereDjango 查询 - 选择位置
【发布时间】:2019-01-06 06:10:12
【问题描述】:

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

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

我在下面的 sn-p 中包含了等效的 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)

【问题讨论】:

  • 您的Client 模型与ClientStaffAssignmentUser 模型无关

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


【解决方案1】:

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

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 字段会自动为每个模型生成,因此您不必显式定义它。

【讨论】:

  • 感谢您为我指明正确的方向,我已经回答了解决方案。
【解决方案2】:

好的,这里的关键是在 Client 模型上添加 ManyToManyField 并确保在中间 (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)

【讨论】:

    猜你喜欢
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-04-02
    • 1970-01-01
    • 2013-11-07
    • 2021-11-25
    相关资源
    最近更新 更多