0

だからここに私の質問があります:
私は何人かの人のフルネームのリストを持っていて、私のユーザーをフィルタリングして、それらの人々のどれがすでに私のユーザーであるかを確認したいとします。

問題は、ユーザーが名と姓を持っていることですが、私が持っているのはフルネームのリスト、つまり「first_name + last_name」です。

私は3つのステップでフィルタリングしようとしていました。最初に、リスト内のfirst_namesを持つすべてのユーザーをフィルタリングしてから、last_nameでフィルタリングします.3番目のステップは、結果間の正確な一致をチェックすることですが、問題は、__in演算子は部分一致ではなく完全一致を検索するため、リスト内の first_name を持つユーザー。
だから
とにかくこのようなフィルタを行うことはありますか:

users.filter(first_name__in__icontains=list_of_people)   

またはさらに良いことに、次のようなフィルターを使用できますか:

users.filter((first_name+ ' ' + last_name)__in=list_of_people)

?
どんな助けでもいただければ幸いです:)
ありがとう

4

1 に答える 1

2

通常のクエリセットでは不可能と思われます。リストを繰り返し処理して、次のような一致を見つける必要があると思います。

from django.db.models import Q     

qs = User.objects.all()
for fullname in list_of_names:
    firstname, lastname = fullname.split()
    qs = qs.filter(
        Q(first_name__icontains = firstname), 
        Q(last_name__icontains = lastname)
    )

別のオプションは、この場合に問題ない生のクエリを使用することです。クエリは次のようになります。

SELECT * FROM users WHERE CONCAT(firstname, ' ', lastname) IN (list_of_name)

ただし、これは大文字と小文字が区別されないわけではないため、とにかく生のクエリを避けるようにしてください。

于 2013-08-17T10:52:00.320 に答える