代码之家  ›  专栏  ›  技术社区  ›  Maverik Minett

Django查询-选择位置

  •  0
  • Maverik Minett  · 技术社区  · 7 年前

    我有一个 Client , Users ClientUsersAssignment 表。客户端被分配给另一个用户。

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

    我在下面的代码片段中包含了等效的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 回复  |  直到 7 年前
        1
  •  0
  •   blhsing    7 年前

    Client User 在这种情况下,有一个多对多的关系,因此您应该定义您 顾客 用户 用一个 ManyToManyField :

    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
  •  0
  •   Maverik Minett    7 年前

    好的,这里的关键是添加 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)