Porównaj ceny domen i usług IT, sprzedawców z całego świata

Jak przechowywać pustą wartość jako pole całkowite


Widziałem wszystkie podobne strumienie, przeczytałem dokumenty i próbowałem wielu kombinacji, aby zapisać pustą wartość jako
IntegerField
w DB i za każdym razem kończyło się niepowodzeniem.
Używam MySQL.
Mój
models.py
definiuje pole
age = models.IntegerField ()
. Wypełniam bazę danych z pliku csv, a niektóre komórki nie robią żadnej różnicy. Dokumentacja Django mówi:
Field.nullIf True, Django will store empty values as NULL in the database. Default is False.
Note that empty string values will always get stored as empty strings, not as NULL.

Ponieważ pracuję z
IntegerField
, chcę, aby pusty ciąg (pusta komórka z csv) był przechowywany jako
NULL
w bazie danych. Więc (myślę) powinienem dodać
null = True
do pola
age
. W rzeczywistości próbowałem więcej niż to:
age=models.IntegerField()
age=models.IntegerField(null=True)
age=models.IntegerField(null=True, blank=True)
age=models.IntegerField(null=True, blank=True, default=None)

i za każdym razem, gdy wstawiam pustą linię do bazy danych, którą otrzymuję
ValueError: invalid literal for int() with base 10: ''

Zgadnij, co jeszcze mogę zrobić?
Zaproszony:
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Ciąg nie jest liczbą całkowitą, a pusty ciąg to nie
None
ani
NULL
. To, co musisz zrobić, to złapać te wystąpienia, w których pole jest puste, a następnie przesłać je na
None
.
foo = "something" # "something" is coming from your CSV filetry:
val = int(foo)
except ValueError:
# foo is something that cannot be converted to
# a number. It could be an empty string, or a
# string like 'hello'
# provide a default value
val = None# Now use val to insert into the database
f = MyModel()
f.age = val
f.save()

blank
https://docs.djangoproject.com ... tions
przeznaczone wyłącznie do sprawdzania nowej wiedzy; nie ma wpływu na stronę bazy danych:

Zauważ, że to różni się od
null
.
null
jest czystym
jest powiązany z bazą danych, natomiast
blank
jest związany z walidacją. Jeśli pole
ma
blank = True
, sprawdzanie poprawności formularza pozwoli na wprowadzenie pustej wartości.
Jeśli pole zawiera
blank = False
, to to pole będzie wymagane.

null
https://docs.djangoproject.com ... tions
z drugiej strony dotyczy bazy danych:

Jeśli True, to Django będzie przechowywać puste wartości jako NULL w bazie danych. Wartość domyślna to False.

IntegerField
wymaga wartości, którą można przekonwertować na liczbę całkowitą, więc po przekazaniu

pusta linia
, nie może go rzucić i zgłasza wyjątek. Zamiast tego, jeśli przekażesz
None
i masz
age = models.IntegerField (null = True)
, wie, że ma to poprawnie zapisać.
Zreasumowanie:
  • age = models.IntegerField()
    To pole jest wymagane i wymaga prawidłowej wartości całkowitej. Nie zaakceptuje
    None
    i nie będzie miał wartości null w bazie danych. Prawidłowe wartości to od -53 do 2147483647
  • age = models.IntegerField(null=True)
    To pole jest wymagane (walidacja formularza). Jeśli pole ma wartość
    None
    , zostanie przekonwertowane na
    NULL
    w bazie danych.
  • age = models.IntegerField(blank=True, null=True)
    Pole nie jest wymagane (walidacja formularza). Jeśli pole zostanie przekazane do
    None
    , zostanie przetłumaczone na
    NULL
  • age = models.IntegerField(blank=True)
    Pole nie jest wymagane (walidacja formularza), ale należy przekazać poprawną wartość całkowitą, ponieważ baza danych nie akceptuje wartości null. Zwykle w tym przypadku nadawałeś mu wartość domyślną z
    default = 0
    lub sprawdzasz ją przed przesłaniem wartości do orm.
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Spróbuj przekazać do tego pola
None
, a nie pusty ciąg ”
Anonimowy użytkownik

Anonimowy użytkownik

Potwierdzenie od:

Możesz przesłonić metodę 'clean' w swojej klasie formularza, a następnie wyczyścić dane całkowite, aby uniknąć wysyłania pustego ciągu, patrz przykład poniżej:
def clean(self):
self.cleaned_data = super(YourForm, self).clean()
if self.cleaned_data['age'] == '': self.cleaned_data['age'] = None
return self.cleaned_data

Aby odpowiedzieć na pytania, Zaloguj się lub Zarejestruj się