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.
[PEP-008] (http://www.python.org/dev/peps/pep-0008) –