2011-08-16 37 views
5

Tôi đang cố thêm trường ForeignKey vào mô hình Django bằng cách sử dụng miền Nam. Tôi gặp phải lỗi sau:Làm cách nào để bạn chỉ định mặc định cho trường Ngoại ngữ Django?

ValueError: You cannot add a null=False column without a default value. 

Tôi đã làm, trên thực tế, chỉ định giá trị mặc định cho trường, nhưng tôi không chắc mình đã làm đúng chưa.

language = models.ForeignKey(Language, default=Language.objects.all()[0]) 

Điều này có hiệu quả không?

Trả lời

7

AFAIK Django sẽ không thực thi QuerySet được chuyển làm thông số, ngay cả khi nó được giới hạn trong một phần tử. Bạn nên thử một cái gì đó như được đề xuất in this post

class Foo(models.Model): 
    a = models.CharField(max_length=10) 

def get_foo(): 
    return Foo.objects.get_or_create(id=1) 

class Bar(models.Model): 
    b = models.CharField(max_length=10) 
    a = models.ForeignKey(Foo, default=get_foo) 
+0

tôi sẽ gửi cùng. Bạn có thể tạo phần tử mặc định trong get_foo nếu Foo không có dữ liệu. – balazs

+1

Có, sử dụng get_or_create là ý tưởng hay! – radious

2

Đây thực sự là phần mở rộng cho câu trả lời @radious. Bạn cũng có thể sử dụng lambda trong mặc định, nếu bạn đang tìm kiếm để cắt ra dòng mã

class Foo(models.Model): 
    a = models.CharField(max_length=10) 

class Bar(models.Model): 
    b = models.CharField(max_length=10) 
    a = models.ForeignKey(Foo, default=lambda: Foo.objects.get_or_create(id=1)[0]) 

lưu ý rằng bạn phải sử dụng chỉ số 0 trên get_or_create() vì phương thức trả về một tuple, vì vậy bạn cần lấy đối tượng, thay vì tuple.

https://docs.djangoproject.com/en/1.6/ref/models/querysets/#get-or-create

+0

Django không thể tuần tự hóa các biểu thức lambda –

1
def get_default(): 
    result, _ = Foo.objects.get_or_create(id=1) 
    return result 

Tôi đã nghĩ đó là giải pháp tốt hơn so với

return Foo.objects.get_or_create(id=1) 

vì get_or_create trở tuple

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