NullBooleanField 始终为 True
NullBooleanField is always True
请抽出宝贵的时间帮助我。
我的应用的想法是每个用户都会收到一组相同的 30 张卡片,然后他必须决定每张卡片是否重要。
我有2个类如下:
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 中,当用户决定卡片是否重要时:
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")
我不明白为什么:
print(choice) # return admin: Card 1: False
但是
print(Choice.objects.get(card__card_number=1)) # return admin: Card 1: True
谢谢!
is_important
取自 GET
QueryDict
作为(大概)非空字符串。当您将这样的字符串作为 (Null)BooleanField
的参数传递时,ORM 会将其转换为 bool
,并且由于非空字符串的计算结果为 True
,这就是存储在分贝
假设您传递 'True'
、'False'
或 'None'
作为 is_important
的获取参数,您可以这样做:
is_important = request.GET.get('is_important') # this is a string
is_important = {'True': True, 'False': False, 'None': None}[is_important]
我也许应该补充一点,即使 get
调用检索了插入的数据库记录,.objects.create()
返回的实例和 .objects.get()
create
电话。前者仍将具有作为 kwargs
传递的属性(如字符串 'False'
),而后者将具有从数据库检索的属性(因此 BooleanField
的值现在将转换为 bool
):
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'))
除了 schwobaseggl 的回答(另一种方式)之外,您最好使用 Django forms 和 cleaned_data
来防止这些并发症。
请抽出宝贵的时间帮助我。
我的应用的想法是每个用户都会收到一组相同的 30 张卡片,然后他必须决定每张卡片是否重要。
我有2个类如下:
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 中,当用户决定卡片是否重要时:
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")
我不明白为什么:
print(choice) # return admin: Card 1: False
但是
print(Choice.objects.get(card__card_number=1)) # return admin: Card 1: True
谢谢!
is_important
取自 GET
QueryDict
作为(大概)非空字符串。当您将这样的字符串作为 (Null)BooleanField
的参数传递时,ORM 会将其转换为 bool
,并且由于非空字符串的计算结果为 True
,这就是存储在分贝
假设您传递 'True'
、'False'
或 'None'
作为 is_important
的获取参数,您可以这样做:
is_important = request.GET.get('is_important') # this is a string
is_important = {'True': True, 'False': False, 'None': None}[is_important]
我也许应该补充一点,即使 get
调用检索了插入的数据库记录,.objects.create()
返回的实例和 .objects.get()
create
电话。前者仍将具有作为 kwargs
传递的属性(如字符串 'False'
),而后者将具有从数据库检索的属性(因此 BooleanField
的值现在将转换为 bool
):
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'))
除了 schwobaseggl 的回答(另一种方式)之外,您最好使用 Django forms 和 cleaned_data
来防止这些并发症。