2015-06-09 16 views
5

Tôi đang có mô hình Person để lưu trữ chi tiết người.đối tượng mô hình tuần tự hóa với các đối tượng liên quan đến JSON

class Person(models.Model): 
    first_name = models.CharField(max_length=100) 
    last_name = models.CharField(max_length=100)  
    birthdate = models.DateField() 

cũng tôi đang có mô hình PersonLogs để lưu trữ các bản ghi hoạt động của người đó.

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person) 
    time = models.DateTimeField(auto_now_add=True) 

Tôi đang sử dụng Django Serializer để trả lại đối tượng Person thành định dạng JSON làm phản hồi.

from django.core import serializers 
data = serializers.serialize("json", Person.objects.all()) 

Output:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
    } 
} 

Bây giờ tôi muốn quay trở lại PersonLogs vào phản ứng JSON.

sản lượng dự kiến:

{ 
    "model": "store.person", 
    "fields": { 
     "first_name": "Douglas", 
     "last_name": "Adams", 
     "birth_date": "1952-03-11", 
     "personlogs": [['2015-06-09 15:42:58.861540'], ['2014-06-09 15:42:58.861540'], [2013-06-09 15:42:58.861540]] 
    } 
} 

Tôi nhìn vào tài liệu chính thức nhưng tôi đã không nhận được bất kỳ sự giúp đỡ. link

+4

Bạn nên sử dụng Django Nghỉ ngơi khung; serializers của nó linh hoạt hơn nhiều và có thể được cấu hình để theo dõi các mối quan hệ. –

+0

Cảm ơn bạn đã đề xuất. Tôi đã làm điều này với sự giúp đỡ của Rest serializer. –

Trả lời

3

Dường như bạn muốn tuần tự hóa Person với mối quan hệ ngược lại ForeignKey. Trình serializer của Django không hỗ trợ điều đó. Bạn sẽ phải sử dụng khung REST Django, ví dụ: như được nêu trong các nhận xét của @DanielRoseman.

Nhưng nếu bạn có thể thỏa hiệp, giải pháp sau sẽ hoạt động.

class PersonManager(models.Manager): 
    def get_by_natural_key(self, first_name, last_name, birthdate): 
     return self.get(first_name=first_name, last_name=last_name, birthdate=birthdate) 

class Person(models.Model): 
    objects = PersonManager() 

    # other fields 
    ... 

Bây giờ, thay vì serializing Person, bạn sẽ phải serialize PersonLogs, mà sẽ ra này:

{ 
    "pk": 1, 
    "model": "models.PersonLogs", 
    "fields": { 
     "time": "2015-06-09 15:42:58.861540", 
     "person": ["Douglas", "Adams", "1952-03-11"] 
    } 
} 
1

Bạn có thể sử dụng mẫu serialize.

cho biết tên liên quan đến PersonLogs

class PersonLogs(models.Model): 
    person = models.ForeignKey(Person,related_name='logs') 
    time = models.DateTimeField(auto_now_add=True) 

Tạo mẫu serialize

logs_template = { 
    'fields': [':local'], 
} 
person_template = { 
    'fields' :[':local',':related'], 
    'related':{ 
     'logs':logs_template, 
    } 
} 

Serialize nó với bên dưới chức năng:

from preserialize.serialize import serialize 
finaldata = serialize(data, **person_template) 
Các vấn đề liên quan