在 Django 过滤器中加入两个模型

Posted

技术标签:

【中文标题】在 Django 过滤器中加入两个模型【英文标题】:Join two models in Django filter 【发布时间】:2016-08-13 14:36:41 【问题描述】:

我可能会因为找不到合适的关键字而感到愚蠢,但这是实际的问题: 我正在尝试通过在Django 中加入两个不同的模型来选择 数据库值。 考虑以下models.py

class Token(models.Model):
    userid = models.TextField()
    access_token = models.TextField()
    refresh_token = models.TextField(default='None', null=True)

class File(models.Model):
    userid = models.ForeignKey(Token, on_delete=models.CASCADE)
    name = models.TextField()
    link = models.TextField()
    size = models.BigIntegerField()

我现在想获取来自 File 的所有文件及其对应的 access_tokenuserid。 我尝试执行以下操作:

data = File.objects.filter(name__startswith='Dummystring')

这种场景下如何获取access_token?

【问题讨论】:

【参考方案1】:

使用values 或values_list 连接表并获取值。使用__ to do field lookups:

data = File.objects.filter(name__startswith='Dummystring') \
                   .values_list('userid__access_token', 'userid__userid')

【讨论】:

太棒了,谢谢 (+1)。我不知道您也可以在 values() 函数中进行字段查找。很快就会接受你的回答并喜欢Django(更像是php的家伙)。 短期跟进:现在输出看起来像"userid__access_token": 'test1234',我可以去掉userid__ 前缀吗? 那就是这个问题:***.com/questions/10598940/…。如果您只需要一个或两个值,您可以只使用values_list,对吗?它基本上会给你一个元组列表。 再次感谢,会调查的! @ShangWang 如果没有为 userid__userid 找到行怎么办?是否有可能返回空值?

以上是关于在 Django 过滤器中加入两个模型的主要内容,如果未能解决你的问题,请参考以下文章

在web.xml中加入过滤器

在 django admin 中加入两个表以获取 display_list 的列

Django:在使用模板继承时在基本模板文件中加载自定义过滤器时出现问题

Django ORM按两个相关模型的最大列值过滤

如何在Django中加入非主键和外键列的查询

Django模型过滤器并按特定列区分