如何解决这样如何通过非模型远程字段进行订购?
我有一张这样的桌子:
class SystemPushLog(models.Model):
...
user_id = models.IntegerField(null=True)
您在上面的模型中可以看到,user_id
是IntegerField
,而不是外键。从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 举报,一经查实,本站将立刻删除。