2010-09-20 37 views
34

Tôi đã nghiên cứu phát triển một số dịch vụ RESTful trong Django để sử dụng với cả ứng dụng Flash và Android.Nối tiếp các đối tượng khóa ngoài ở Django

Phát triển giao diện dịch vụ khá đơn giản, nhưng tôi đã gặp sự cố với việc sắp xếp các đối tượng có khóa ngoài và nhiều mối quan hệ.

Tôi có một mô hình như thế này:

class Artifact(models.Model): 
    name    = models.CharField(max_length = 255) 
    year_of_origin  = models.IntegerField(max_length = 4, blank = True, null = True) 
    object_type   = models.ForeignKey(ObjectType, blank = True, null = True) 
    individual   = models.ForeignKey(Individual, blank = True, null = True) 
    notes    = models.TextField(blank = True, null = True) 

Sau đó, tôi sẽ thực hiện một truy vấn trên mô hình này như thế này, sử dụng select_related(), để chắc chắn rằng các mối quan hệ chính nước ngoài được tuân thủ:

artifact = Artifact.objects.select_related().get(pk=pk) 

Khi tôi có đối tượng, tôi sắp xếp lại đối tượng và chuyển lại cho tôi xem:

serializers.serialize("json", [ artifact ]) 

Đây là những gì tôi nhận được trở lại, lưu ý rằng các phím nước ngoài (object_type và cá nhân) chỉ là id của các đối tượng liên quan của họ.

[ 
     { 
      pk: 1 
      model: "artifacts.artifact" 
      fields: { 
       year_of_origin: 2010 
       name: "Dummy Title" 
       notes: "" 
       object_type: 1 
       individual: 1 
      } 
     } 
] 

này là rất tốt, nhưng những gì tôi đã hy vọng cho khi sử dụng select_related() là nó sẽ tự động đặt các trường trọng điểm nước ngoài với các đối tượng có liên quan, id không chỉ của đối tượng.

Tôi đang chuyển đổi gần đây thành Django, nhưng đặt trong một khoảng thời gian hợp lý để phát triển với CakePHP.

Điều tôi thực sự thích về ORM bánh là nó sẽ theo dõi các mối quan hệ và tạo đối tượng lồng nhau theo mặc định, với khả năng hủy liên kết các mối quan hệ khi bạn đang gọi truy vấn của mình.

Điều này giúp dễ dàng trừu tượng hóa các dịch vụ theo cách không yêu cầu bất kỳ sự can thiệp nào theo từng trường hợp.

Tôi thấy rằng Django không làm điều này theo mặc định, nhưng có cách nào để tự động sắp xếp một đối tượng và tất cả các đối tượng liên quan của nó không? Bất kỳ lời khuyên hoặc đọc sẽ được nhiều đánh giá cao.

+1

[PEP-008] (http://www.python.org/dev/peps/pep-0008) –

Trả lời

24

Tôi có yêu cầu tương tự mặc dù không phải cho mục đích RESTful. Tôi đã có thể đạt được những gì tôi cần bằng cách sử dụng mô-đun tuần tự "đầy đủ", trong trường hợp của tôi Django Full Serializers. Đây là một phần của wadofstuff và được phân phối theo giấy phép BSD mới.

Wadofstuff làm việc này khá dễ dàng. Ví dụ: trong trường hợp của bạn, bạn cần phải làm như sau:

Đầu tiên, cài đặt wadofstuff.

Thứ hai, thêm các thiết lập sau đây để tập settings.py của bạn:

SERIALIZATION_MODULES = { 
    'json': 'wadofstuff.django.serializers.json' 
} 

Thứ ba, thực hiện thay đổi nhỏ về mã được sử dụng cho serialization:

artifact = Artifact.objects.select_related().get(pk=pk) 
serializers.serialize("json", [ artifact ], indent = 4, 
    relations = ('object_type', 'individual',)) 

Sự thay đổi quan trọng là tham số relations từ khóa . Duy nhất (nhỏ) gotcha là sử dụng tên của các lĩnh vực hình thành mối quan hệ không phải là tên của các mô hình liên quan.

Caveat

Từ documentation:

Các Wad của Stuff serializers là 100% tương thích với các serializers Django khi tuần tự một mô hình. Khi deserializing một dòng dữ liệu các lớp Deserializer hiện chỉ hoạt động với dữ liệu tuần tự được trả về bởi serializers Django chuẩn.

(Nhấn mạnh thêm)

Hope this helps.

10

UPDATE: Thực ra giải pháp Manoj được một chút lỗi thời, Wad của serializer Stuff có được bỏ liên tục trong một thời gian và khi tôi thử điều đó, có vẻ như nó không hỗ trợ Django 1.6 nữa.

Tuy nhiên, hãy xem Django's official doc here. Nó cung cấp một số cách xung quanh bằng cách sử dụng chìa khóa tự nhiên được xây dựng trong. Có vẻ như bộ nối tiếp tích hợp sẵn của django có một chút vấn đề khi sử dụng ImageField như một phần của khóa tự nhiên. Nhưng điều đó có thể dễ dàng được sửa bởi chính bản thân bạn.

+0

Cảm ơn! Tôi quên mất khóa tự nhiên;) –

+0

@Shen Haochen, liên kết của bạn dường như không thể truy cập được nữa. Nhưng tôi đồng ý với bạn rằng giải pháp nêu trên đã lỗi thời. Bạn có thể vui lòng làm mới liên kết không? –

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