2017-10-10 5 views
0

そのアイテムがジャンゴORMクエリ - リバースリスト検索

User.objects.filter(name__in = [ 'X'、 'Y'])

等DjangoのORMを介して、リストにあるかどうかをチェックすることは容易どのように逆の方法について。 ユーザーが彼が浮気している郊外のリスト(カンマ区切りのリスト)を持っている場合、特定の郊外を訪問していないかどうかを確認する必要があります。 shell_plusから取得

class User(models.Model): 
    suburb = models.TextField(_('suburbs'),validators=[validate_comma_separated_integer_list], blank=True) 

データは郊外100を訪問していないすべてのユーザーを取得したい

{'suburb': '965,967,969,972' } 

のためにこの種のだろうか?あなたはPostgresのDBを使用している場合

+0

、データベース;文字列の代わりにレコードへの実際の参照があるように、モデルを正しく構造化しない限り –

答えて

2

Q objectsを使用すると、これを実現できます。

startswith_string = str(suburb) + "," 
contains_string = "," + str(suburb) + "," 
endswith_string = "," + str(suburb) 

users = User.objects.filter(
    Q(suburb__startswith=startswith_string) | Q(suburb__contains=contains_string) | Q(suburb__endswith=endswith_string), 
) 
+0

これは最後に存在する場合にも値1100を含むエントリを含みます。 –

+1

それはありません。エントリは '、100'で終わるはずです。 'endswith_string'の先頭にカンマがあることに注意してください。 – anupsabraham

+0

あなたはすべてのQでcontainsを使用していると思った;) –

0

あなたは

User.objects.exclude(suburb__contains='100') 

ようcontains lookupを使用することができ、その後、私はあなたの代わりにコンマseprated値のArrayFieldを使用することをお勧めします。

+0

これにより、値1000を含むエントリも除外されます。 – anupsabraham

+0

あなたは正しいです、つまりなぜ私は彼にArrayFieldの使用を提案していますか? –

0

あなたの入力は{ '郊外': '965967969972'}である場合in検索

User.objects.exclude(suburb__in=['100']) 

を除外する使用してみてください。これは、より検索エンジンのためのより多くの仕事です

input = {'suburb': '965,967,969,972' } 
input_list = input['suburb'].split(',') # Split the string into list 
User.objects.exclude(suburb__in=input_list)