微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

这样如何通过非模型远程字段进行订购?

如何解决这样如何通过非模型远程字段进行订购?

我有一张这样的桌子:

class SystemPushLog(models.Model):
    ...
    user_id = models.IntegerField(null=True)

您在上面的模型中可以看到,user_idIntegerField,而不是外键。从gRPC调用中检索出Cuz用户信息输出系统。现在,我想通过last_login来排序查询集,这是用户信息中的一个字段。 我在annotate中尝试过使用get_queryset

    def get_queryset(self):
        queryset = super().get_queryset().annotate(
            last_login=self.__class__.get_user_last_login(F('user_id'))
        )

下面是get_user_last_login

    @staticmethod
    def get_user_last_login(user_id):
        print('user_id',user_id)  # <<< user_id F(user_id)
        print('type of user_id',type(user_id))  # <<< type of user_id <class 'django.db.models.expressions.F'>

        # retrieving user info from rpc call.
        user = do_user_actions({'id': user_id})
        return user.last_login

如您所见,传递给函数F('user_id')django.db.models.expressions.F的一种类型,而不是实际的user_id

也许annotate可以采用一些简单的表达式,例如annotate(off_price=F('original_price') - F('discount_price'))

那么,我应该如何实现这种远程现场订购?

解决方法

如果您不介意在SystemPushLog中添加last_login字段,可以通过将last_login字段设置为空,则可以通过覆盖django @classmethod def create()来填充last_login,因为它具有last_login字段,因此可以轻松订购模型

我还没有尝试过,但是类似的东西应该可以工作

def create(self,*args,**kwargs):
    if 'user_id' in kwargs and isinstance(kwargs['type'],int):
        # retrieving user info from rpc call.
        user = do_user_actions({'id': user_id})
        kwargs['last_login'] = user.last_login
    return super(SystemPushLog,self).create(*args,**kwargs)

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。