2009-07-06 11 views
29

Tôi đang viết một mixin cho phép Mô hình của tôi dễ dàng được dịch thành một giá trị sâu sắc (giống như .values ​​(), nhưng đi qua các mối quan hệ). Nơi sạch nhất để làm các định nghĩa của những vẻ là trong các mô hình bản thân, a la:Thêm các thuộc tính vào lớp Meta của Mô hình Django

class Person(models.Model, DeepValues): 
    name = models.CharField(blank=True, max_length=100) 
    tribe = models.ForeignKey('Tribes') 

    class Meta: 
     schema = { 
      'name' : str, 
      'tribe' : { 
       'name' : str 
      } 
     } 

Person.objects.all().deep_values() => { 
    'name' : 'Andrey Fedorov', 
    'tribe' : { 
     'name' : 'Mohicans' 
    } 
} 

Tuy nhiên, Django phàn nàn về tôi bao gồm này trong class Meta với:

TypeError: 'class Meta' got invalid attribute(s): schema 

(toàn bộ stack trace here)

Bây giờ, tôi cho rằng tôi có thể ghi đè lên điều này một cách công phu trong mixin của mình, nhưng có cách nào lưu trữ thông tin này một cách thanh lịch hơn không?

Trả lời

45

Tôi không biết gì về tao nhã, nhưng có một cách thực dụng là:

import django.db.models.options as options 

options.DEFAULT_NAMES = options.DEFAULT_NAMES + ('schema',) 

Rõ ràng, điều này sẽ phá vỡ nếu Django bao giờ thêm một 'schema' thuộc tính của riêng nó. Nhưng hey, đó là một ý nghĩ ... bạn luôn có thể chọn một tên thuộc tính mà ít có khả năng xung đột hơn.

+5

Vì mục đích của hậu thế, điều đó không có tác dụng, nhưng điều này đã làm: tùy chọn.DEFAULT_NAMES = options.DEFAULT_NAMES + ('default_values',) –

+2

Ồ ... có lẽ vì giải pháp của tôi chuyển DEFAULT_NAMES thành danh sách, trong khi tinh lọc của bạn giữ nó như một tuple. –

+0

Rất có thể! :) –