【问题标题】:Django Find custom user with the same value of JSONfieldDjango查找具有相同JSONfield值的自定义用户
【发布时间】:2026-01-26 15:40:01
【问题描述】:
我有一个 django 应用程序,我在其中使用自定义用户模型。模型有一个 JSON 字段,它表示该用户使用哪些编程语言。
它看起来像这样:
{"langs": [1, 2, 3, 4]}
这些数字是语言数据库模型的 ID。
那么是否可以在 DB 中找到与当前用户具有 1 种或多种相同语言的用户。我想得到一个数组,其中包含按匹配语言数排序的自定义用户对象。
对不起,如果这个问题太愚蠢了。
【问题讨论】:
-
我真的建议不要使用JsonField 来引用其他模型。通常使用ManyToManyField。这将在数据库上以一种更方便过滤、聚合等的方式表示,因为关系数据库(类似 SQL)通常不适用于 JSON 等动态和递归数据。
标签:
python
django
database
django-models
django-custom-user
【解决方案1】:
我建议不要使用JsonField 来引用其他模型。 SQL 数据库通常不适用于 递归 和 动态 数据,因为这不是关系数据库在概念上的设计方式。
通常使用ManyToManyField [Django-doc]。这将与junction table [wiki] 一起使用,这使其更易于访问并且可以保证参照完整性。
因此,我们可以使用以下方法对此进行建模:
class ProgrammingLanguage(models.Model):
name = models.CharField(unique=True)
class User(models.Model):
languages = models.ManyToManyField(
ProgrammingLanguage,
related_name='users'
)
如果我们有一个User 对象user,我们可以找到至少有一种语言共同的用户:
User.objects.filter(
languages__users=user
).distinct()
.distinct() call [Django-doc] 将避免多次检索相同用户,因为他们有共同的语言。