2012-03-09 33 views
10

Có cách nào thực hành tốt nhất trong việc xử lý "bảng hỗ trợ" ở Django không?Django - Xử lý "mô hình enum"

Tôi không thích Field.choices, vì nó không thực sự thực thi tính toàn vẹn (nó thậm chí không tạo ràng buộc kiểm tra), vì vậy tôi thích tạo một mô hình toàn diện (và thường, tôi thấy mình thêm các trường bổ sung trong bảng hỗ trợ)). Bây giờ, nếu tôi sử dụng một mô hình đầy đủ, tôi cho rằng đúng cách để đi là tạo ra một vật cố dữ liệu ban đầu cho nội dung bảng, nhưng có một "cách đúng" để có được các trường hợp có tên của hàng không, ví dụ như vậy. ..

class State(models.Model): 
    name = model.TextField() 

STATES = dict(
    NEW=State.objects.get(pk=0), 
    IN_PROGRESS=State.objects.get(pk=1), 
) 

... hoặc tương tự như vậy.

Điều gì làm bạn sử dụng?

+2

tôi bây giờ điều này là từ 11 tháng trước, nhưng bạn đã tìm thấy bất kỳ thực hành tốt đặc biệt cho việc này? Tự hỏi điều tương tự ở đây. – blaze

Trả lời

8

Django ORM kiểm tra tính toàn vẹn nếu bạn chỉ định thuộc tính lựa chọn (khi bạn chèn/cập nhật dữ liệu qua biểu mẫu người dùng).

Bạn cũng có thể đặt logic xác thực thành cấp cơ sở dữ liệu và sử dụng trường ENUM của cơ sở dữ liệu nếu bạn hỗ trợ điều này.

UPD:

class EnumField(models.Field): 

    def __init__(self, *args, **kwargs): 
     super(EnumField, self).__init__(*args, **kwargs) 
     if not self.choices: 
      raise AttributeError('EnumField requires `choices` attribute.') 

    def db_type(self): 
     return "enum(%s)" % ','.join("'%s'" % k for (k, _) in self.choices) 

GENDER_MALE = 'm' 
GENDER_FEMALE = 'f' 
GENDER_CHOICES = (
    (GENDER_MALE, 'Male'), 
    (GENDER_FEMALE, 'Female'), 
) 


class Person(models.Model): 
    name = models.CharField(max_length=50) 
    gender = EnumField(choices=GENDER_CHOICES) 
+2

Tôi muốn các ràng buộc trong cơ sở dữ liệu, và "enums" là các mô hình đầy đủ với các bảng riêng của chúng. Về cơ bản, tôi đang tự hỏi về cách Pythonic/Djangoish để tạo ra "Python" enum. – alex

+0

Cập nhật câu trả lời của tôi – San4ez

+2

Tôi đề xuất Khác/Không xác định, quá! – Ashe