我有一个文件,用户和共享模型,如下所示:
class File(models.Model):
users = models.ForeignKey(User)
file_name = models.CharField(max_length=100)
type = models.CharField(max_length=10)
source = models.CharField(max_length=100)
start_date = models.TextField()
time_overview = models.CharField(max_length=55)
end_date = models.TextField()
duration = models.TextField()
size_overview = models.IntegerField()
size = models.TextField()
flag = models.TextField()
flag_r = models.TextField()
class Share(models.Model):
users = models.ForeignKey(User)
files = models.ForeignKey(File)
shared_user_id = models.IntegerField()
shared_date = models.TextField()
我找到了使用此查询共享特定文件的用户数:
shared_file = File.objects.filter(id__in= Share.objects.filter(users_id = log_id).values_list('files', flat=True)).annotate(count=Count('share__shared_user_id'))
现在,我想找出与之共享特定文件的用户名。 尝试使用这个:
shared_username = User.objects.filter(id__in= Share.objects.filter(users_id = log_id).values_list('shared_user_id', flat=True))
没有做对。我想获得用户名,整个特定文件是共享的。我怎么能这样做?
答案 0 :(得分:1)
在第二个查询中添加特定文件名的条件:
shared_username = User.objects.filter(id__in = Share.objects.filter(users_id = log_id, files__file_name='file1').values_list('shared_user_id', flat=True))
但是你的模型有一些值得注意的问题:
1-如果您使用OnetoMany字段替换Share.shared_user_id
,您的模型会更正确,您的查询也会更容易。
2-如果您在外键上使用related_name
,则可以从相反的型号访问它们,您的查询会更容易。
3-您不应对外键使用复数var名称,因为它们代表一个对象。对于File.users
和File.user
Share.files
应为Share.users
且相同
4-如果您正确命名您的vars,您的模型可以更具可读性。例如,您可以使用File.users
或File.owner
代替File.owning_user
。与Share.users
相同:Share.sharing_user
。