请稍等 ...
×

采纳答案成功!

向帮助你的同学说点啥吧!感谢那些助人为乐的人

UserEquipment.objects.filter()后对外键字段的去重处理

图片描述

user_equipments_ids = UserEquipment.objects.filter(user=request.user).values('equipment_id').distinct()

这样去重后返回<QuerySet [{‘equipment_id’: 5}, {‘equipment_id’: 4}, {‘equipment_id’: 2}, {‘equipment_id’: 3}]> 无法直接返回前端做展示!

equipment 是要去重的字段 是个外键!

class UserEquipment(models.Model):
    '''用户的借用信息这里'''
    user = models.ForeignKey(UserProfile, verbose_name='用户')
    borrow_time = models.DateTimeField(default=datetime.now, verbose_name='借用日期(时分)')
    plan_to_return_time = models.DateTimeField(null=True, blank=True, verbose_name='计划归还日期(时分)')
    return_time = models.DateTimeField(null=True, blank=True, verbose_name='归还日期(时分)')
    equipment = models.ForeignKey(Equipment, verbose_name='设备')
    add_time = models.DateTimeField(default=datetime.now, verbose_name='添加时间')

    class Meta:
        verbose_name = '用户设备'
        verbose_name_plural = verbose_name

    def __str__(self):
        return self.equipment.name

老师的课程代码个人中心展示的时候应该不需要去重因为

     ......
     ......
        # 查询用户是否关联了此课程
        user_courses = UserCourse.objects.filter(user=request.user, course=course)
        if not user_courses:
            user_course = UserCourse(user=request.user, course=course)
            user_course.save()

用户点击‘开始学习’触发CourseInfoView,在加入UserCourse表之前老师有判断是否已经关联;而我这里不同,用户只要借用一次就记录一次这样可以回头查他的借用记录,而个人中心展示的时候,一个设备你借用多次但是只给你展示一次的就可以了,和老师有点区别。


对同样一个UserEquipment这一个model,上面的是对equipment这个外键做去重,必须自己用 For循环处理后得到对象列表返回给前端做展示,直接返回是不行的。
今天需要对同一个model:UserEquipment的另一个外键字段user做去重,**参考老师说的stackoverflow帖子上的方法,也不行,**仍然需要自己for循环组成一个user_list的列表组合返回给前端做展示,直接返回去重后的结果是不行的!

    def get_borrow_users(self):
        ''' 借用此设备的UserEquipment类的实例组成的QuerySet,未去重'''
        user_equipments = self.userequipment_set.all()
        return user_equipments

    def get_borrow_users_ids_distinct(self):
        '''借用此设备的UserProfile类的实例组成的列表,去重了'''
        user_ids = self.userequipment_set.values_list('user', flat=True).distinct()
        user_list = []
        for user_id in user_ids:
            user_list += UserProfile.objects.filter(id=user_id)
        return user_list

老师到底QuerySet 做去重后是不是无法直接返回给前端做展示?我的去重方法是不是有问题?

正在回答 回答被采纳积分+3

1回答

bobby 2019-05-10 13:57:24

UserEquipment.objects.distinct('equipment_id')
你试试这样

0 回复 有任何疑惑可以回复我~
  • raise NotImplementedError('DISTINCT ON fields is not supported by this database backend')
    NotImplementedError: DISTINCT ON fields is not supported by this database backend
    老师不行
    回复 有任何疑惑可以回复我~ 2019-05-10 14:17:58
  • bobby 回复 提问者 weixin_慕斯卡4281563 #2
    https://stackoverflow.com/questions/15626175/distinct-on-in-django 你看看这个
    回复 有任何疑惑可以回复我~ 2019-05-14 11:45:27
问题已解决,确定采纳
还有疑问,暂不采纳
意见反馈 帮助中心 APP下载
官方微信