2015-01-08 17 views
5

tôi có mô hìnhLàm thế nào tôi có thể nhận được các đối tượng phụ huynh trong django còn lại khung serializer

class Track(models.Model): 
    album = models.ForeignKey(Album) 

này Bây giờ trong TrackSerializer của tôi tôi muốn có được tên của album.

class TrackSerializer(serializers.ModelSerializer): 

    class Meta: 
     model = Track 
     fields = ('album__name') 

nó không làm việc

Tôi không muốn khai báo AlbumSerializer cho điều đó. là có cách nào để làm điều đó mà không cần phân loại serializer mới

+1

Bạn chỉ có thể đặt 'depth = 1' trên TrackSerializer của mình. Điều này sẽ tự động tuần tự hóa các mô hình cha mẹ – toast38coza

Trả lời

10

Bạn có thể làm điều này bằng cách tạo ra một lĩnh vực trên của bạn TrackSerializer rằng has a custom source mà lấy tên album.

Tên thuộc tính sẽ được sử dụng để điền vào trường. Có thể là một phương thức chỉ lấy một đối số tự, chẳng hạn như URLField ('get_absolute_url'), hoặc có thể sử dụng ký hiệu chấm chấm để chuyển các thuộc tính, chẳng hạn như EmailField (source = 'user.email').

Vì vậy, trong trường hợp của bạn, lĩnh vực của bạn sẽ cần phải được bổ sung (album_name trong trường hợp này) với các tùy chỉnh source thiết

class TrackSerializer(serializers.ModelSerializer): 
    album_name = serializers.CharField(read_only=True, source="album.name") 

    class Meta: 
     model = Track 
     fields = ('album_name",) 

này sẽ bao gồm tên album trong đầu ra dưới sự chủ chốt album_name.

+0

có thể gửi liên kết cho các tài liệu còn lại, nơi nó nói rằng chúng tôi có thể truy cập vào peoperties với cú pháp 'album.name', tôi không thể tìm thấy nó – user3214546

+0

"Tên của thuộc tính ... hoặc có thể sử dụng ký hiệu chấm chấm để chuyển các thuộc tính, chẳng hạn như EmailField (source = 'user.email')." Trực tiếp từ liên kết tôi đã bao gồm, trong đối số 'nguồn' –

+0

xin lỗi tôi đã không thấy rằng – user3214546

0

Bạn có thể làm theo cách này (cách sử dụng Python năng động):

def create_serializer(target_class, fields): 
    class ModelSerializer(serializers.ModelSerializer): 

     class Meta: 
      model = target_class 
      fields = fields 

    return ModelSerializer 

Vì vậy, một Theo dõi serializer thể được tạo ra bằng phương pháp này:

TrackSerializer = create_serializer(Track, ('album__name',)) 

Ngoài ra, hãy cẩn thận của ('album__name'), mà là một nghĩ giải lao d biểu thức chuỗi và không phải là tuple như bạn có thể dự định. Để khai báo nó như một tuple, thêm một dấu phẩy sau nó, như thế này:

fields = ('album__name',) 
+0

album__name không hoạt động như tên trường. Đây là những gì tôi đã hỏi trong câu hỏi của tôi. bạn đã giải quyết cách để làm cho nhà máy sản xuất serilizer nhưng vấn đề ban đầu vẫn còn remian rằng tôi không thể đi qua album__name trong serilaizer – user3214546

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