首页 > 解决方案 > 如何通过 __in 过滤另一个模型对象列表

问题描述

嗨我想在两个模型之间进行查询而没有任何连接

我想检查ModelA模型中的名称是否在User

class ModelA(models.Model):
    name = models.CharField(max_length=20)
    #others

如何进行查询以按User模型中已采用的所有名称进行过滤

我试过这些

user_name = User.objects.al() 
#and also this
user_name = list(User.objects.all())
#also this 
user_name = User.objects.values()

ModelA.objects.filter(name__in=user_name)

我需要返回所有已经在User模型中使用的名称!他们都没有工作?还有什么其他的东西可以实现这个目标吗?谢谢

标签: pythondjangofilter

解决方案


您需要选择模型的username值(或其他一些字段)User。例如:

ModelA.objects.filter(
    name__in=User.objects.values_list('username', flat=True)
)

对于某些数据库,例如 MySQL,最好先实现用户名集合:

ModelA.objects.filter(
    name__in=list(User.objects.values_list('username', flat=True))
)

但是,如果您想引用表中的记录,则最好使用ForeignKey[Django-doc]而不是CharField包含相同用户名的 a。

或者对于 a Form,您可以使用以下内容填充它:

类 ClientDailyForm(forms.ModelForm): 客户 = forms.ChoiceField(choices=None)

def __init__(self, *args, **kwargs):
    super().__init__(*args, **kwargs)
    usernames = list(User.objects.values_list('username', flat=True))
    self.fields['values'].choices = [
        (c, c)
        Client.objects.filter(
            name__in=usernames
        ).values_list('name', flat=True).distinct()
    ]

class Meta:
    model = InvoiceCustomer
    fields = '__all__'

推荐阅读