2013-03-11 26 views
9

tôi có sự kiện xảy ra tại các địa điểm:Django REST Framework: xác định các trường trong đối tượng lồng nhau?

class Event(models.Model): 
    title = models.CharField(max_length=200) 
    date_published = models.DateTimeField('published date',default=datetime.now, blank=True) 
    date_start = models.DateTimeField('start date') 
    date_end = models.DateTimeField('end date') 
    def __unicode__(self): 
     return self.title 
    description = models.TextField() 
    price = models.IntegerField(null=True, blank=True) 
    tags = TaggableManager() 
    location = models.ForeignKey(Location, blank=False) 

class Location(models.Model): 
    location_title = models.CharField(max_length=200) 
    location_date_published = models.DateTimeField('published date',default=datetime.now, blank=True) 
    location_latitude = models.CharField(max_length=200) 
    location_longitude = models.CharField(max_length=200) 
    location_address = models.CharField(max_length=200) 
    location_city = models.CharField(max_length=200) 
    location_zipcode = models.CharField(max_length=200) 
    location_state = models.CharField(max_length=200) 
    location_country = models.CharField(max_length=200) 
    location_description = models.TextField() 
    def __unicode__(self): 
     return u'%s' % (self.location_title) 

tôi có thể có được kết quả của tất cả qua:

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    class Meta: 
     model = Event 
     depth = 2 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 

Những kết quả đầu ra:

{ 
      "url": "http://localhost:8000/api/event/3/", 
      "id": 3, 
      "title": "Testing", 
      "date_start": "2013-03-10T20:19:00Z", 
      "date_end": "2013-03-10T20:19:00Z", 
      "description": "fgdgdfg", 
      "price": 10, 
      "location": { 
       "id": 2, 
       "location_title": "Mighty", 
       "location_date_published": "2013-03-10T20:16:00Z", 
       "location_latitude": "37.767475", 
       "location_longitude": "-122.406878", 
       "location_address": "119 Utah St, San Francisco, CA 94103, USA", 
       "location_city": "San Francisco", 
       "location_zipcode": "94103", 
       "location_state": "California", 
       "location_country": "United States", 
       "location_description": "Some place" 
      } 
     }, 

Tuy nhiên, tôi không muốn nó để lấy tất cả các lĩnh vực, vì tôi không cần tất cả chúng. Làm thế nào tôi có thể xác định những trường nào sẽ được lấy ra từ đối tượng lồng nhau của tôi? Cảm ơn!

Trả lời

17

serializers có thể được lồng vào nhau, do đó, làm một cái gì đó như thế này ...

class LocationSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = (...) 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    location = LocationSerializer() 

    class Meta: 
     model = Event 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 
+0

Trường hợp được ghi chép ở đâu? –

+4

Trong phần serializers, 'Đối phó với các đối tượng lồng nhau'. [Ở đây] (http://django-rest-framework.org/api-guide/serializers.html#dealing-with-nested-objects). –

+2

Phần còn lại là tuyệt vời –

4

Tôi đã đến đây và đã không nhận được một giải pháp hoàn hảo, nhưng tôi đã làm một cái gì đó bạn có thể kiểm tra nó.

Phương pháp này sẽ không tạo ra serializers lồng nhau

**class LocationSerializer(serializers.ModelSerializer):** 
    class Meta: 
      model = Location 
      fields = (...)  #does not matter 
      exclude = (...)  #does not matter 

class EventSerializer(serializers.ModelSerializer):** 
    loc_field_1 = serializers.CharField(required=False,*source='location.loc_field_1'*) 
    loc_field_2 = serializers.CharField(required=False,*source='location.loc_field_2'*) 

    ***#ADD YOUR DESIRE FIELD YOU WANT TO ACCESS FROM OTHER SERIALIZERS*** 


    class Meta: 
     model = Event 
     fields =('url','id','title','date_start','date_end','description', 'price', 'location') 
3

Tôi tìm thấy câu hỏi này khi tôi đã cố gắng tìm ra cách để loại trừ các lĩnh vực nhất định từ một serializer chỉ khi nó được lồng nhau. Có vẻ như Tasawer Nawaz cũng có câu hỏi đó. Bạn có thể làm điều đó bằng cách ghi đè get_field_names. Dưới đây là ví dụ dựa trên câu trả lời của Tom Christie:

class LocationSerializer(serializers.ModelSerializer): 
    class Meta: 
     model = Location 
     fields = (...) 
     exclude_when_nested = {'location_title', 'location_date_published'} # not an official DRF meta attribute ... 

    def get_field_names(self, *args, **kwargs): 
     field_names = super(LinkUserSerializer, self).get_field_names(*args, **kwargs) 
     if self.parent: 
      field_names = [i for i in field_names if i not in self.Meta.exclude_when_nested] 
     return field_names 

class EventSerializer(serializers.HyperlinkedModelSerializer): 
    id = serializers.Field() 
    location = LocationSerializer() 

    class Meta: 
     model = Event 
     fields = ('url','id','title','date_start','date_end','description', 'price', 'location') 
Các vấn đề liên quan