2013-12-10 15 views
10

Tôi có một mô hình:Django REST của khung: lĩnh vực mặc định ở dạng API browseable

class XCall(models.Model): 
    created_on = models.DateTimeField(auto_now_add=True) 
    send_on = models.DateTimeField(default=datetime.now) 
    recipient = models.ForeignKey(User) 
    text = models.CharField(max_length=4096) 
    backup_calls = models.IntegerField(blank=True, null=True) 

Và một serializer cho mô hình:

class CallSerializer(serializers.HyperlinkedModelSerializer): 
    url = serializers.HyperlinkedIdentityField(
     view_name='call-detail', 
    ) 
    # some validation and custom field definitions 
    ... 

    class Meta: 
     model = XCall 
     fields = ('url', 'id', 'text', 'recipient', 'send_on', 'backup_calls', 'status') 
     lookup_field= 'pk' 

Và đây là danh sách xem:

class CallList(generics.ListCreateAPIView): 
    serializer_class = CallSerializer 
    permission_classes = (permissions.IsAuthenticatedOrReadOnly, IsOwnerOrSuperuser,) 

    def pre_save(self, obj): 
     auth_user = self.request.user 
     obj.auth_user = auth_user 

    def get_queryset(self): 
     """ 
     This view should return a list of all the calls 
     for the currently authenticated user. 
     """ 
     auth = self.request.user 
     if isinstance(auth, AnonymousUser): 
      return [] 
     elif auth.is_superuser: 
      return XCall.objects.all() 
     else: 
      return XCall.objects.filter(auth_user=auth) 

Trong API có thể duyệt của CallList, tôi thấy thông tin sau trong biểu mẫu BÀI ĐĂNG ở dưới cùng: enter image description here

Câu hỏi của tôi là: tại sao không có giá trị mặc định được đặt cho send_on và có một giá trị cho backup_calls? Tôi giả định rằng biểu mẫu sẽ tuân theo đặc điểm kỹ thuật mô hình XCall và sử dụng datetime.now() để đặt mặc định trước đây và để trống backup_calls (vì nó không có giá trị). Làm thế nào tôi có thể nhận được mẫu để làm theo các thông số kỹ thuật mô hình?

+0

Bạn đã từng giải quyết vấn đề này chưa? Tôi hiện đang chạy vào nó. – user2734679

Trả lời

3

Có sự khác biệt giữa giá trị mặc định của mô hình và giá trị ban đầu trong biểu mẫu. Điều này đặc biệt đúng đối với các giá trị mặc định thực sự hoạt động vì chúng chỉ được gọi khi cá thể được lưu. Ví dụ: bạn muốn now nào - lần này khi biểu mẫu trống được hiển thị hoặc thời gian người dùng nhấn "POST"? Django áp dụng mặc định khi lưu mô hình nếu giá trị trường bị thiếu. Để đạt được những gì bạn muốn, bạn cần phải tự thiết lập mặc định trong lĩnh vực serialize, ví dụ:

class CallSerializer(serializers.HyperlinkedModelSerializer): 
    send_on = serializers.DateTimeField(default=datetime.now) 
    ... 
+0

Tôi không chắc chắn tôi đang nhìn thấy hành vi mà bạn mô tả. Khi tôi cố gắng đăng bài mà không cần send_on điền vào, tôi nhận được một lỗi xác nhận "Trường này là bắt buộc". Nếu bạn đang nói Django áp dụng mặc định trên lưu, tại sao lỗi xác nhận? Một số bit khác của thông tin: 1) Tôi đang trên Django 1,6; Tôi mơ hồ nhớ tất cả những điều này hoạt động khác trước khi tôi nâng cấp từ 1.4. 2) Kỳ lạ thay, tôi thấy các giá trị hình thức mặc định làm việc như tôi mong đợi trong chế độ phát triển Django, nhưng không phải trong env sản xuất của tôi (Django + Apache + mod_wsgi). – Neil

+0

Và cũng có thể, câu trả lời này không giải thích tại sao tôi thấy giá trị mặc định cho trường 'backup_calls'. Tôi không thiết lập rõ ràng nó trong 'CallSerializer' – Neil

+1

IIRC, xác thực trường đầu tiên xảy ra trong biểu mẫu. Biểu mẫu thấy rằng không có gì được nhập vào send_on, nó là bắt buộc và theo trường biểu mẫu không có mặc định, do đó, nó đưa ra một ngoại lệ trước khi vào mô hình. Tôi không biết tại sao nó sẽ làm việc khác nhau trong sản xuất mặc dù - âm thanh như nó có thể là một số vấn đề bộ nhớ đệm lạ. – aquavitae

2

Bạn thực sự muốn thiết lập một giá trị initial, không phải là một giá trị mặc định. Xem docs. Mã của bạn phải là:

from django.utils import timezone 


class CallSerializer(serializers.HyperlinkedModelSerializer): 
    send_on = serializers.DateTimeField(initial=timezone.now()) 
    ... 

Giá trị mặc định là giá trị được cung cấp cho thuộc tính nếu không có giá trị được đặt cho trường. Sự khác biệt giữa các đối số initialdefault phản ánh sự khác biệt giữa đối số initial của Django đối với trường biểu mẫu và đối số default của Django cho trường mô hình.

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