Vì một số lý do ^, tôi muốn sử dụng UUID làm khóa chính trong một số mô hình Django của tôi. Nếu tôi làm như vậy, tôi vẫn có thể sử dụng các ứng dụng bên ngoài như "contrib.comments", "django-vote" hoặc "django-tagging" có sử dụng quan hệ chung thông qua ContentType không?Sử dụng UUID làm khóa chính trong các mô hình Django (tác động quan hệ chung)
Sử dụng "django-bỏ phiếu" là một ví dụ, mô hình Vote trông như thế này:
class Vote(models.Model):
user = models.ForeignKey(User)
content_type = models.ForeignKey(ContentType)
object_id = models.PositiveIntegerField()
object = generic.GenericForeignKey('content_type', 'object_id')
vote = models.SmallIntegerField(choices=SCORES)
Ứng dụng này dường như được giả định rằng các khóa chính cho mô hình được bình chọn trên là một số nguyên.
Việc xây dựng trong kiến ứng dụng có vẻ là khả năng xử lý PKS phi nguyên, mặc dù:
class BaseCommentAbstractModel(models.Model):
content_type = models.ForeignKey(ContentType,
verbose_name=_('content type'),
related_name="content_type_set_for_%(class)s")
object_pk = models.TextField(_('object ID'))
content_object = generic.GenericForeignKey(ct_field="content_type", fk_field="object_pk")
Đây có phải là "nguyên-PK-giả định" vấn đề một tình huống phổ biến cho các ứng dụng của bên thứ ba mà sẽ sử dụng UUID làm đau? Hoặc, có thể, tôi đang hiểu sai tình huống này?
Có cách nào để sử dụng UUID làm khóa chính ở Django mà không gây ra quá nhiều sự cố không?
^ Một số lý do: số lượng đối tượng lẩn trốn, ngăn chặn url "id bò", sử dụng nhiều máy chủ để tạo các đối tượng phi mâu thuẫn, ...
Ngoài ra, bạn có thể ghi đè 'save' và tạo UUID của bạn có khi một đối tượng đang được lưu lần đầu tiên (bằng cách kiểm tra nếu đối tượng có một khóa chính). –
Joe Holloway, không cần điều đó: bạn có thể chỉ cần cung cấp hàm tạo UUID làm 'mặc định' của trường. –
Cảm ơn Piet. Giải pháp của bạn là những gì tôi đang làm bây giờ và nó hoạt động để che khuất khóa chính trong URI (mặc dù ứng dụng bình luận vẫn hiển thị nó trong một trường ẩn trong biểu mẫu "tạo bình luận").Không cho tôi lợi thế là có thể dễ dàng tạo ra các hàng cơ sở dữ liệu không va chạm trên các máy chủ riêng biệt. Ồ, tôi đoán tôi sẽ học cách yêu lại khóa chính nguyên. – mitchf