Python Django查询按字段对选择不同的
我有一个“提交”字段,它有一个用户和一个问题。我怎样才能得到一个SQL搜索结果,它将给出每个用户问题对只有一个结果的列表 模型如下:Python Django查询按字段对选择不同的,python,django,django-queryset,Python,Django,Django Queryset,我有一个“提交”字段,它有一个用户和一个问题。我怎样才能得到一个SQL搜索结果,它将给出每个用户问题对只有一个结果的列表 模型如下: class Problem(models.Model): title = models.CharField('Title', max_length = 100) question = models.TextField('Question') class Submission(models.Model): user = models.For
class Problem(models.Model):
title = models.CharField('Title', max_length = 100)
question = models.TextField('Question')
class Submission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
solution = models.CharKey()
time = models.DateTimeField('Time', auto_now_add=True)
更新2: (在阅读了OP的评论后)我建议添加一个新的模型来跟踪最新的提交。称之为
LatestSubmission
class LatestSubmission(models.Model):
user = models.ForeignKey(User)
problem = models.ForeignKey(Problem)
submission = models.ForeignKey(Submission)
那你也可以
Submission.save()
以在用户每次发布问题的新解决方案时在LatestSubmission
中创建/更新条目LatestSubmission
将为每个问题用户包含一行提交组合,指向每个用户针对问题的最新提交。一旦您准备好了,您就可以启动一个查询:
LatestSubmission.objects.all().order_by('problem')
更新:
由于OP发布了示例代码,现在可以按如下方式更改解决方案:
for user in User.objects.all(): # Get all users
user.submission_set.latest('time') # Pick the latest submission based on time.
原始答案
如果没有任何基于日期/时间的标准来决定哪个是“旧的”还是“新的”,您可以使用Submission
的主键(id
)来“忽略旧的”
试试这个:
distinct_users_problems = Submission.objects.all().values("user", "problem").distinct()
它会给你一个类似这样的口述清单:
[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}]
包含所有不同对的
它实际上会导致您通常的SELECT DISTINCT SQL查询。您所说的“有用户和问题的字段”是什么意思?你说的是Django模特吗?发布相关代码。模型如下:问题:标题,问题提交:问题(foreignkey),用户(foreignkey),内容用户:auth user让我们假设p1,p2两个问题和u1,u2是两个用户u1有两个提交s1,s2为p1,一个(s3)为p2,u2有一个为p1(s4),两个为p2(s5,s6)所以我想要一个这样的查询集结果:s2,s3,s4,s6,即忽略具有相同用户问题的旧问题s2,s3,我在问题中添加了模型细节。这将只提供用户上次提交的查询集,我想要的是所有问题的最新结果。我想在提交字段上运行sql命令,获得按提交时间排序的提交列表,如果同一用户在一个问题中提交了多个提交,则只会包含一个结果。@Rohan Jain:根据当前模型结构,我不确定使用一个sql查询是否可以做到这一点。我想知道这里是否有其他人能给出合适的答案。我现在正在为提交添加一个is_最新的布尔字段……thanx fr ur help:)
[{'problem': 1, 'user': 1}, {'problem': 2, 'user': 1}, {'problem': 3, 'user': 1}]