【问题标题】:Django remove Duplicates after filtering from model objectsDjango从模型对象过滤后删除重复项
【发布时间】:2020-08-24 17:09:01
【问题描述】:

我有一个名为 Course 的模型,我一直在尝试使用过滤器功能获取它们的列表。现在每门课程都有不同的领域。

我的课程模式是:

class Course(models.Model):
    course_code = models.CharField(max_length=20)
    course_university = models.CharField(max_length=100)
    course_instructor = models.CharField(max_length=100)
    course_year = models.IntegerField(('year'), validators=[MinValueValidator(1984), MaxValueValidator(max_value_current_year())])
    course_likes = models.ManyToManyField(Profile, blank=True, related_name='course_likes')
    course_dislikes = models.ManyToManyField(Profile, blank=True, related_name='course_dislikes')
    course_reviews = models.ManyToManyField(Review, blank=True, related_name='course_reviews')

我正在为牛津大学名为“Smiths”的讲师准备课程

courses = Course.objects.filter(course_instructor="smiths",course_university="university")

如何删除具有此名称的重复项,例如显示最近年份的名称? 例如,2017、2018、2019年牛津大学Smith教授将开设ABC123课程。 . 我怎样才能只退回其中之一?我试过distinct(),但它不起作用。

有没有办法做到这一点?或者我应该改变我的数据库的整个结构?

编辑:我试过了,但它仍然给我重复:

course_dup = Course.objects.filter(course_instructor=par2,course_university=par1).values('course_instructor', 'course_university').annotate(course_year=Max('course_year'))
courses = Course.objects.filter(course_instructor__in=[c['course_instructor'] for c in course_dup], course_university__in=[c['course_university'] for c in course_dup])

为了澄清起见,假设有以下值:

   course_code | course_instructor | course_year | course_university 

1. ABC123      | smith             | 2017        | Oxford
2. ABC123      | smith             | 2017        | Oxford
3. CDE123      | smith             | 2018        | Oxford
4. ADF123      | smith             | 2019        | Oxford
5. ABC123      | smith             | 2019        | Oxford

我只想返回例如 3,4,5,因为 5 是最新的课程代码 ABC123,甚至是查询返回 1,3,4 应该可以工作,因为 1 是匹配查询的第一个匹配项。我怎样才能做到这一点?

【问题讨论】:

    标签: django django-models django-views django-templates


    【解决方案1】:

    这会解决你的问题

    course_dup = Course.objects.filter(course_instructor="smiths",course_university="university").values('course_instructor', 'course_university').annotate(course_year=MAX('course_year'))
    

    编辑:: 既然你想要一个查询集,那么在这个查询之后你可以运行这个

    courses = Course.objects.annotate(combined_key=Concat('course_instructor', V('_'), 'course_university', V('_'), 'course_year',output_field=CharField())).filter(combined_key__in=["{}_{}_{}}".format(c['course_instructor'], c['course_university'], c['course_year']) for c in course_dup])
    
    

    【讨论】:

    • 似乎当我使用这个时,我所有的课程模型方法都不起作用,因为这将返回一个字典。如何返回课程对象?我想用查询返回课程对象
    • ` courses = Course.objects.filter(course_instructor__in=[c['course_instructor'] for c in course_dup], course_university__in=[c['course_university'] for c in course_dup]) ` 这个查询错了
    【解决方案2】:

    这会排除第一个值并删除其余的值

    courses = Course.objects.filter(course_instructor="smiths",course_university="university")
    if len(courses) > 1:
        courses[1:].delete()
    

    【讨论】:

      猜你喜欢
      • 2010-12-31
      • 2013-03-16
      • 1970-01-01
      • 1970-01-01
      • 2020-07-02
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多