我有一个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)
答案 0 :(得分:0)
Client
和User
在这种情况下具有多对多关系,因此您应使用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
字段是为每个模型自动生成的,因此您不必显式定义它。
答案 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)