【问题标题】:how to filter by __in for another model objects list如何通过 __in 过滤另一个模型对象列表
【发布时间】:2020-06-24 19:13:53
【问题描述】:

您好,我想在没有任何连接的情况下在两个模型之间进行查询

我想检查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 模型中使用的名称! 他们都没有工作?还有什么其他的东西可以实现这个目标吗? 谢谢

【问题讨论】:

    标签: python django filter


    【解决方案1】:

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

    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

    或者对于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__'
    

    【讨论】:

    • @art_cs:到底是什么问题?哪些值不应该出现在结果中,反之亦然?
    • 我只想返回那些已经被其他模型使用的名字
    • @art_cs:是的,但是它(不)返回应该在/(输出)查询集中的什么?查询集中是否有一个名称未被采用的ModelA,或者一个ModelA 不在被采用的查询集中?
    • @art_cs:好的,但是查询集返回(不返回)您认为它不应该(应该)返回的内容。
    • 您提供的查询没有返回任何内容
    猜你喜欢
    • 2021-10-30
    • 2021-01-26
    • 2021-05-31
    • 2017-06-14
    • 2011-10-29
    • 1970-01-01
    • 2020-01-27
    • 2021-12-05
    • 1970-01-01
    相关资源
    最近更新 更多