2016-05-14 5 views
0

あなたの貴重な時間を惜しみ、助けてください。NullBooleanFieldは常にTrueです

私のアプリのアイデアは、各ユーザーが同じ30枚のカードのセットを受け取ることです、そして、彼は各カードが重要か否かを決定しなければなりません。

次のように私は2つのクラスを持っている:

card_number= request.GET.get('card_number') 
    is_important= request.GET.get('is_important')  
    user = request.user 

    # assume that user=admin, card_number=1 and is_important is False 

    if card_number != None and is_important != None: 
     try: 
      card = Card.objects.get(card_number=card_number) 
      choice= Choice.objects.create(user=user, card=card, is_important=is_important) 
      print(choice) # return admin: Card 1: False 
      print(Choice.objects.get(card__card_number=card_number)) # return admin: Card 1: True 
      print(choice) # return admin: Card 1: False 
     except IntegrityError: 
      print("User had done with this Card") 

私は理由を理解していない:

class Card(models.Model): 
    card_number = models.IntegerField(unique=True) 
    content = models.TextField(null=False) 

    def display(self): 
     return self.content 

    def __str__(self): 
     return "Card " + str(self.card_number) 


class Choice(models.Model): 
    user = models.ForeignKey(User) 
    card = models.ForeignKey(Card) 
    is_important = models.NullBooleanField(default=None) 

    class Meta: 
     unique_together = ('user','card') 

    def get_choices(user): 
     return Choice.objects.filter(pk=user.pk) 

    def __str__(self): 
     return " %s : Card %d : %s" % (self.user.username, self.card.card_number, self.is_important) 

とviews.py内のユーザーはカードが重要であるかを決定したとき、

print(choice) # return admin: Card 1: False 

しかし

print(Choice.objects.get(card__card_number=1)) # return admin: Card 1: True 

ありがとうございました!

+0

'Choice'モデル定義のreturn文は別のレベルでインデントされる必要があります。 – Nez

+0

と' Meta'宣言 – Nez

+0

ではGETリクエストの例を挙げることができますか? – iulian

答えて

3

is_importantは、(おそらく)空でない文字列としてGETQueryDictから取られます。このような文字列を(Null)BooleanFieldのパラメータとして渡すと、ORMはそれをboolにキャストし、空でない文字列はTrueと評価します。これがdbに格納されます。

is_importantのためのパラメータを取得するよう、あなたのようSTHを行うことができ、あなたが'True''False'または'None'を渡すと仮定すると:私は多分.objects.create()によって返されたインスタンスと.objects.get()によって返されたインスタンスではないことを追加する必要があります

is_important = request.GET.get('is_important') # this is a string 
is_important = {'True': True, 'False': False, 'None': None}[is_important] 

getコールがcreateコールによって挿入されたdbレコードを取得しても、必ず同じです。データベースから取り出され、後者が属性を持っています(したがってBooleanFieldの値は、現在boolにキャストする)前者は依然として(ストリング'False'等)kwargsとして渡された属性を持っています:

choice = Choice.objects.create(user=user, card=card, is_important=is_important) 
# choice.is_important = 'False' 

choice = Choice.objects.get(user=user, card=card, is_important=is_important) 
# choice.is_important = True (= bool('False')) 
+0

あなたのソリューションをありがとう。 {'True':真、 'False':偽、 'None':None} [is_important]はとても知的な方法です! –

1

schwobasegglの答え(別の方法)に加えて、Django formscleaned_dataと併用すると、これらの合併症を防ぐことができます。

+0

ありがとうございました。私はDjangoフォームを使用しません。なぜなら、この単純なクラスChoiceでは必要ではないと思うからです。とにかく、物事が複雑になると、私はフォームを試してみます。ところで、あなたの名前はベトナム語に聞こえますか?私はベトナム人です。 –

+0

ねえ。 Tat nhien roi。ベトナム。 Nhin cai ten la biet :)ここにお会いしてうれしい、私の友人:) – trantu

関連する問題