2014-05-19 17 views
7

Tôi muốn có một đối tượng lồng nhau bên trong một serializer thay vì chỉ là nước ngoài (hoặc url). Như this documentation nói, tôi chỉ phải xác định lớp serializer của đối tượng lồng nhau trong serializer mẹ:Django-phần còn lại-khung, đối tượng lồng nhau trong Serializers

# Models 

class NestedSample(models.Model): 
    something = models.CharField(max_length=255) 

class Sample(models.Model): 
    thing = models.BooleanField() 
    nested = models.ForeignKey(NestedSample) 

# Serializers 

class NestedSampleSerializer(serializers.HyperlinkedModelSerializer): 

    class Meta: 
     model = api_models.NestedSample 

class SampleSerializer(serializers.HyperlinkedModelSerializer): 
    nested = NestedSampleSerializer() # HERE! 

    class Meta: 
     model = api_models.Sample 

# Views 

class NestedSampleViewSet(viewsets.ModelViewSet): 
    queryset = api_models.NestedSample.objects.all() 
    serializer_class = api_serializers.NestedSampleSerializer 

class SampleViewSet(viewsets.ModelViewSet): 
    queryset = api_models.Sample.objects.all() 
    serializer_class = api_serializers.SampleSerializer 

này hoạt động rất tốt khi tôi nhận được các đối tượng, nhưng nó không phải là có thể tạo ra (= POST) Sample đối tượng nữa, tôi nhận được lỗi:

{u'non_field_errors': [u'Invalid data']} 

tôi cố gắng để ghi đè lên các phương pháp create trong viewset để có được những đối tượng sử dụng pk:

class SampleViewSet(viewsets.ModelViewSet): 
    queryset = api_models.Sample.objects.all() 
    serializer_class = api_serializers.SampleSerializer 

    def create(self, request): 
     request.DATA['nested'] = get_object_or_404(api_models.NestedSample, pk=request.DATA['nested']) 
     return super(SampleViewSet, self).create(request) 

Nhưng nó cũng không hoạt động.

Bất kỳ ý tưởng nào?

Tôi cũng tìm thấy this question Tôi có thể liên hệ với khóa học nào giải quyết vấn đề nhưng không để tôi phơi bày đối tượng lồng nhau đầy đủ, vì vậy hãy quay lại phần đầu.

Xin cảm ơn,

+0

Bạn không cần phải ghi đè 'tạo' để điền dữ liệu yêu cầu của bạn bằng một ví dụ NestedSample, chuỗi PK sẽ hoạt động một mình. – Fiver

+0

Xem câu trả lời này: http://stackoverflow.com/questions/23686888/how-to-implement-nested-models-routes/23696134#23696134 – YAtOff

Trả lời

2

Tôi có thể nghĩ đến hai giải pháp cho vấn đề này. Tôi thích cái đầu tiên.

Giải pháp đầu tiên:

Sử dụng biểu mẫu mô hình django để tạo đối tượng. Ghi đè các phương thức tạo và cập nhật. Phương thức tạo mẫu:

def create(self, request): 
    form = SampleForm(data=request.POST) 
    if form.is_valid(): 
     instance = form.save(commit=False) 
     instance.save() 
     return Response(dict(id=instance.pk), status=status.HTTP_201_CREATED) 
    return Response(form.errors, status=status.HTTP_400_BAD_REQUEST) 

theo cách này bạn có thể tạo Đối tượng mẫu với bất kỳ loại xác thực nào bạn muốn.

Giải pháp thứ hai:

Ghi đè phương thức get_serializer_class và trả về bộ nối tiếp dựa trên phương thức yêu cầu. Xác định hai serializers một cho bài và đặt và một cho danh sách và lấy.

2

Bạn có thể xác nhận rằng bạn đang gửi yêu cầu được mã hóa JSON - tức là yêu cầu có loại nội dung được đặt thành JSON không? Nếu không, bài đăng có thể gửi nhất bằng cách sử dụng định dạng biểu mẫu không hỗ trợ lồng nhau.

+0

Không, tôi chỉ gửi các giá trị sử dụng định dạng cơ bản, tôi không biết tên của nó: '? thing = 1 & nested = 2' và tôi gửi' pk' của đối tượng lồng nhau hiện có, tôi không muốn tạo một đối tượng mới. – db0

+0

Sử dụng rest_framework.test.APIClient trong các thử nghiệm của tôi đã sửa lỗi này cho tôi. (http://www.django-rest-framework.org/api-guide/testing#apiclient) – yndolok

+0

Đây là lần đầu tiên tôi đề cập đến việc tìm mã hóa chính xác tại thời điểm thử nghiệm - cảm ơn @XavierOrdoquy ... Thêm 'định dạng = 'json'' cho yêu cầu 'client.post' của tôi tại thời điểm thử nghiệm đã sửa lỗi này cho tôi. – jamesc

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