2012-01-29 32 views
5

thể trùng lặp:
Django dynamic model fieldsDjango người dùng cuối được xác định các trường, làm thế nào để?

Morning chàng trai tốt! Kịch bản là như sau. Đối với một số mô hình trên Django, tôi muốn cho phép người dùng cuối xác định các trường của riêng mình. Nó sẽ là tuyệt vời nếu tôi có thể giữ tất cả các tính năng tuyệt vời của Django như ORM, vì vậy tôi vẫn có thể thực hiện các cuộc gọi như field__gte để tìm kiếm trên mô hình, vẫn có xác nhận trường theo loại trường, v.v. Tôi đã nghĩ về hai cách làm điều này, và tôi còn cởi mở hơn với những gợi ý mới. Bất kỳ thông tin phản hồi sẽ được VERY đánh giá cao.

  1. Cách tiếp cận đầu tiên, là thuộc tính-giá trị thuộc tính (http://en.wikipedia.org/wiki/Entity%E2%80%93attribute%E2%80%93value_model), mà django đã có ứng dụng. Xem http://code.google.com/p/django-custom-field/ Tôi nghĩ rằng đây sẽ là giải pháp OK, nhưng tôi mất khả năng thực hiện "mymodel.objects.filter (custom_field_x = something)". Có lẽ có một cách để lấy lại ORM, bất kỳ ý tưởng nào? Nhưng tôi đã nghe rất nhiều câu chuyện xấu về phương pháp này mà tôi hơi sợ sử dụng nó.

  2. Cách tiếp cận thứ hai là có bảng cơ sở dữ liệu cho từng người dùng (có thể không quá 1000). Tôi đã đọc django có một cái gì đó trong dòng inspectdb, mà thực sự kiểm tra các lĩnh vực có và tạo ra các mô hình cho bạn. Điều này có thể hữu ích nhưng tôi nghĩ có lẽ tôi nên lưu trữ các lĩnh vực người dùng cụ thể này đã tạo ra và bằng cách nào đó dinamically nói với django, hey, chúng tôi cũng có các lĩnh vực này trong mô hình này. Điều này có thể không? Tôi biết nó thường là xấu để có bảng khác nhau cho mỗi người dùng, nhưng xem xét kịch bản này, làm thế nào các bạn sẽ đánh giá phương pháp này, nó sẽ là ok để có một bảng cho mỗi người dùng?

Mô hình yêu cầu trường tùy chỉnh là ví dụ Person. Họ có thể muốn một trường tùy chỉnh để lưu trữ địa chỉ, nhóm máu hoặc bất kỳ thứ gì khác.

NHIỀU CẢM ƠN trước! Chuc ngay chủ nhật tôt lanh!

Rất giống: How to create user defined fields in Django - nhưng chỉ nói về EAV mà tôi muốn tránh. Tôi mở cho những ý tưởng mới!

+1

Tìm thấy tài liệu tham khảo tốt nhất bao giờ hết: http://stackoverflow.com/questions/7933596/django-dynamic-model-fields Xin lỗi, câu hỏi của tôi là bản sao của một trong những . Mods, cảm thấy tự do để đóng nó. – Clash

Trả lời

1

Một cách tiếp cận là sử dụng giải pháp dựa trên tài liệu NoSQL như MongoDB cho phép bạn lưu trữ các đối tượng có cấu trúc chất lỏng (không hạn chế như cột được xác định trước).

Ưu điểm:

  1. Không hạn chế trên các loại lĩnh vực tùy chỉnh, số lượng các loại lĩnh vực vv
  2. Giữ nguyên chức năng ORM (django-mongodb)
  3. lợi ích khác nhau khác của NoSQL - mà bạn có thể đọc về trực tuyến
  4. tránh EAV

Nhược điểm:

  1. Cần thiết lập máy chủ NoSQL
  2. Cần có kiến ​​thức bổ sung về khái niệm NoSQL (tài liệu so vớibảng)
  3. Bạn có thể phải duy trì hai cơ sở dữ liệu - nếu bạn quyết định không di chuyển toàn bộ giải pháp của bạn để NoSQL (multi-db)

EDIT:

Sau khi đọc các ý kiến ​​giá trị của nó chỉ ra rằng tùy thuộc vào mà bạn sử dụng giải pháp NoSQL, bạn có thể không cần hỗ trợ đảo ngược. CouchDB, ví dụ đã được xây dựng để hỗ trợ cho document versioning.

+0

Xin chào, cảm ơn vì câu trả lời của bạn! mongodb trông rất tuyệt. Đáng buồn là chia sẻ của tôi lưu trữ không hỗ trợ nó. Tôi đang tìm kiếm một webhosting mới (nhưng đó là một vấn đề khác). Dù sao, những gì tôi muốn hỏi là: bạn có biết nếu sử dụng mongodb phá vỡ bất kỳ ứng dụng khác? Ví dụ, nếu tôi sử dụng django-sửa đổi (http://djangopackages.com/packages/p/django-revisions/), nó sẽ vẫn hoạt động? Rất cám ơn trước! – Clash

+1

@Clash, vâng, sử dụng mongodb sẽ phá vỡ các ứng dụng django bên ngoài mà không mong đợi để sử dụng một db NoSQL. Vì vậy, sửa đổi django sẽ không hoạt động. Tuy nhiên, bạn có thể thiết lập nhiều cơ sở dữ liệu kể từ khi Django bây giờ hỗ trợ đó. Vấn đề duy nhất với điều đó là không thể tham gia qua các cơ sở dữ liệu này. – Spike

+0

@Spike, tôi hiểu. Tôi sẽ không thể sử dụng sửa đổi trên các mô hình sử dụng các lĩnh vực tùy chỉnh sau đó tôi đoán? Rất cám ơn bạn đã trả lời! – Clash

1

điều gì tạo ra một mô hình khác để lưu trữ user_defined_fields?

class UserDefinedField(models.Model): 
     #.................. 
     user = models.ForeignKey(User) 
     field_name = models.CharField(max_length=50) 
     field_value = models.TextField() 

Sau đó, bạn có thể làm UserDefinedField.objects.filter(field_name=some_name,field_value=somevalue)

+1

Tôi đoán đây chỉ là một biến thể nhỏ của EAV – Clash

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