2013-05-16 44 views
13

Tôi đang sử dụng khung công tác REST của Django 2.0.ForeignKey không cho phép giá trị null

Đây là lớp mô hình của tôi:

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

Đây là lớp quan điểm của tôi:

class MissionList(generics.ListCreateAPIView): 
    model = Mission 
    serialize_class = MissionSerializer 
  1. Dạng nhiều phần dữ liệu được trả lại trong trình duyệt với sự lựa chọn sản phẩm nào cho assigned_to lĩnh vực.

  2. Khi đăng JSON liệu, tôi nhận được thông báo lỗi sau:

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

Trả lời

46

Tùy chọn blank được sử dụng trong các hình thức xác nhận, và null được sử dụng khi văn bản cho cơ sở dữ liệu.

Vì vậy, bạn có thể thêm null=True vào trường đó.

EDIT: tiếp tục bình luận

Xét theo hai bước khi lưu đối tượng:

  1. Validator (điều khiển bởi blank)
  2. giới hạn cơ sở dữ liệu (điều khiển bởi null)

Đối với tùy chọn default, hãyVí dụ:,
default=5, blank=True, null=False, vượt qua (1) ngay cả khi bạn không chỉ định giá trị (có blank=True), vượt qua (2) vì giá trị mặc định (5) và viết 5 thay vì None.
blank=True, null=False, vượt qua (1) nhưng không (2), bởi vì nó cố gắng viết None cho DB.

Do đó, nếu bạn muốn tạo trường tùy chọn, hãy sử dụng default=SOMETHING, blank=True, null=False hoặc blank=True, null=True.

Một ngoại lệ khác là trường giống chuỗi, chẳng hạn như CharField.
Được đề xuất chỉ sử dụng blank=Truemột mình, để lại null=False phía sau.
Điều này làm cho một trường hoặc là một chuỗi (> = 1 char (s)) hoặc một chuỗi rỗng ('', với len() == 0), và không bao giờ None.

Lý do là khi null=True được đặt, sẽ có hai giá trị có thể cho trạng thái "bỏ đặt cược": chuỗi rỗng và None, gây nhầm lẫn (và có thể gây ra lỗi).

+0

Có nghĩa là 'trống = True 'luôn luôn phải được sử dụng với' null = True'? Tại sao tôi không thể chọn trống trong biểu mẫu của mình? Tôi đã sử dụng 'blank = True'. –

+1

'assigned_to == None' đã vượt qua trình duyệt tính hợp lệ của biểu mẫu, nhưng không phải là cơ sở dữ liệu. Nếu không có 'null = True', bạn không thể ghi' None' vào cơ sở dữ liệu. Vì vậy, nói chung, nếu bạn muốn một trường tùy chọn, hãy đặt cả 'blank' và' null' thành 'True'. – user1034937

+2

Tuy nhiên, có hai trường hợp ngoại lệ, tùy chọn 'mặc định' và các trường giống như chuỗi. (Tôi muốn thêm sau bài đăng, thay vì ở đây, nhận xét.) – user1034937

0

ForeignKey cho phép giá trị null nếu hành vi này được đặt. Mã của bạn sẽ trông như thế này:

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

Bạn phải viết null = Đúng Lưu ý: sau khi bạn thay đổi một mô hình, bạn cần phải chạy python manage.py makemigrations yourappname và sau đó python manage.py migrate

Các vấn đề liên quan