2017-09-08 11 views
0

私はget_or_createコールでicontainsを使用して予期せぬ結果を得ています。Django get_or_create with icontains

次の例ください:なぜこれが空白の名前ではなく、「ベアーズ」とチームを作成ん

>>>team_name = "Bears" 
>>>Team.objects.get(name__icontains=team_name) # returns DoesNotExist as expected 
>>>team, created = Team.objects.get_or_create(name__icontains=team_name) 
>>>print(created) # Prints True as expected 
>>>print(team.name) # Prints an empty string! 

を?私がget_or_createを使用している理由は、後のユーザーが"BearS"のようなものを投稿した場合、正しいチームを取得したいと思います。間違った大文字を含む重複チームを作成しないようにします。

答えて

2

私は__icontains検索のみget()のために働くので、あなたが、代わりにget_or_create()を使用してのget()create()機能を分割する必要があり、ここだと思います。このような何かをやって

試してください:Djangoは__セパレーターを含むルックアップを取り除きのでwencakisaの答え以外

>>> team_name = 'Bears' 

>>> teams = Team.objects.filter(name__icontains=team_name) 
# This will filter the teams with this name 

>>> team = teams.first() if teams.exists() else Team.objects.create(name=team_name) 
# Now your team is the first element of your previous query (it returns a QuerySet with single element) if it exists 
# Otherwise, you create a new Team. 
+0

良い点... get_or_create'は 'icontains'を許可していませんでした'ことを認識していませんでした。また、「ゴールデンベア」と呼ばれる別のチームが存在する場合のミスを避けるために、「icontains」の代わりに「iexact」を使用しました。 – YPCrumble

1

別のオプションは、get_or_createdefaultsパラメータを含めることです。 this questionへの回答を参照してください。

コードは次のようになります。

Team.objects.get_or_create(
    name__icontains=team_name, 
    defaults = { 
     "name": team_name 
    } 
) 
関連する問題