2013-05-16 31 views
13

Django REST Framework 2.0 kullanıyorum.ForeignKey null değerlerine izin vermiyor

class Mission(models.Model): 
    assigned_to = models.ForeignKey('auth.User', 
            related_name='missions_assigned', 
            blank = True) 

İşte benim bakış sınıftır:

İşte benim modeli sınıftır

class MissionList(generics.ListCreateAPIView): 
    model = Mission 
    serialize_class = MissionSerializer 
  1. çok parçalı formu assigned_to alanı için boş seçim ile tarayıcıda oluşturulur.

Cannot assign None: "Mission.assigned_to" does not allow null values.

cevap

46

blank seçenek form doğrulama kullanılır ve veritabanına yazarken null kullanılır: ham JSON gönderirken

  • , aşağıdaki hata iletisi alıyorum.

    Bu alana null=True ekleyebilirsiniz.

    DÜZENLEME: (null ile kontrol)

    1. Doğrulayıcı (blank ile kontrol edilen)
    2. Veritabanı sınırlama
    : nesne kaydederken iki adım göz önüne alındığında yorumunu

    devam

    default seçeneği içinnumaralı telefonu alın Örneğin,
    , bir değer atamadıysanız (blank=True), geçiş (2), varsayılan bir değer (5) olduğundan ve None DB'ye yerine yazdığından (1) geçin.
    blank=True, null=False, None DB'ye yazmayı denediğinden (1) ancak (2) 'yi geçmez. Bu nedenle, bir alanı isteğe bağlı yapmak istiyorsanız, default=SOMETHING, blank=True, null=False veya blank=True, null=True'u kullanın.

    Diğer bir istisna, CharField gibi dize gibi alanlardır.
    null=False'u geride bırakarak blank=True'u kullanın.
    Bu, bir alan ya bir dize (> = 1 karakter (ler)) veya boş bir dize ('', with len() == 0) yapar ve hiçbir zaman None yapmaz.

    Bunun nedeni, null=True ayarlandığında, "unset" durumunda iki olası değer olacaktır: boş dize ve None, bu kafa karıştırıcı (ve hatalara neden olabilir).

  • +0

    boş = Doğru 'Anlamı 'her zaman null = True' ile kullanılmalıdır? Neden formumda boş seçemiyorum? Ben boş = True' kullanmıştım. –

    +1

    'assign_to == Yok 'form doğrulayıcıyı geçti, ancak veritabanı değil. 'null = True' olmadan,' None' veritabanına yazamazsınız. Böylece, genellikle, isteğe bağlı bir alan istiyorsanız, hem 'blank' hem de 'null' öğesini "True" olarak ayarlayın. – user1034937

    +2

    Ancak, iki özel durum var: 'varsayılan' seçeneği ve dize gibi alanlar. (Buraya yazı, yorum eklemek yerine yorum eklemek istiyorum.) – user1034937

    0

    ForeignKey, bu davranış ayarlanmışsa boş değerlere izin verir. Kodunuz aşağıdaki gibi görünecektir:

    class Mission(models.Model): 
        assigned_to = models.ForeignKey('auth.User', related_name='missions_assigned',blank = True,null=True) 
    

    Sen null adlı yazmak zorunda = Gerçek Not: Bir modeli değiştirdikten sonra, sen python manage.py makemigrations yourappname çalıştırmak gerekiyor ve ardından python manage.py migrate

    İlgili konular