2015-12-15 21 views
6

Tôi có một phụ huynh và một mô hình con có liên quan một-một và tôi muốn hiển thị các trường từ căn hộ con trong biểu diễn gốc (read only). Hiện nay, tôi đã đạt được điều đó với một triển khai thực hiện to_representation tùy chỉnh nhưng điều đó dường như rất có liên quan và tôi tự hỏi nếu không có cách nào dễ dàng hơn để đạt được điều này.Khung còn lại Django đại diện cho đối tượng lồng nhau được làm phẳng

Điều này trở nên phức tạp hơn do thực tế là mô hình liên quan của tôi được kết nối thông qua thuộc tính.

Vì vậy, đây là ví dụ cụ thể: Theo mặc định một đối tượng có liên quan sẽ được trả lại như:

{ 
    parent_name:'Bob', 
    child:{ 
    name:'Alice' 
    } 
} 

Đây là những gì tôi muốn và hiện đang nhận được với to_representation tôi:

{ 
    parent_name:'Bob',  
    child_name:'Alice' 
} 

Mô hình của tôi trông giống như sau:

class ChildModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 

class ParentModel(models.Model): 
    name = models.CharField(max_length=100, null=True) 
    _child = models.ForeignKey('ChildModel', null=True) 

    @property 
    def child(self): 
     return self._most_recent_status 

    @name.setter 
    def child(self, value): 
     self._child = value 

Đây là serializers của tôi:

class FlatChildField(serializers.RelatedField): 
    def to_representation(self, value): 
     return value.name 


class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = FlatChildField(source='_child', read_only=True) 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

Để có giải pháp đơn giản hơn để có được đại diện phẳng của các mô hình liên quan, tôi sẽ biết ơn.

Để hoàn thành, tôi muốn nghe nếu có giải pháp đơn giản hơn cho các mô hình có liên quan "bình thường" (ví dụ: không phải là trường mô hình thuộc tính). Tôi đã tìm kiếm tương đương với cú pháp truy vấn mô hình django của related_model__field, nhưng tôi không thể tìm thấy điều đó. Điều đó tồn tại đối với khung thời gian còn lại của django?

Rất cám ơn

Trả lời

13

Các phương tiện đơn giản nhất là nên sử dụng source:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.CharField(source='_child.name', read_only=True) 

class Meta: 
    model = Parent 
    fields = ('name', 'child_name') 
+0

Điều này hoạt động rất nhiều, cảm ơn. –

+0

Điều này cũng hoạt động mà không có read_only, đó là tuyệt vời cho làm phẳng các mô hình lồng nhau! – alekwisnia

3

Bạn có thể sử dụng SerializerMethodField, nó giúp bạn tiết kiệm thực sự rất nhiều công việc, và nó thật sạch và tầm thường:

class FlatParentSerializer(serializers.ModelSerializer):  
    parent_name = serializers.CharField(source='name', read_only=True) 
    child_name = serializers.SerializerMethodField('get_child_name') 

    class Meta: 
     model = Parent 
     fields = ('name', 'child_name') 

    def get_child_name(self, obj): 
     return obj._child.name 
Các vấn đề liên quan