Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/320.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python Django查询按字段对选择不同的_Python_Django_Django Queryset - Fatal编程技术网

Python Django查询按字段对选择不同的

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

我有一个“提交”字段,它有一个用户和一个问题。我怎样才能得到一个SQL搜索结果,它将给出每个用户问题对只有一个结果的列表

模型如下:

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}]