2013-03-12 29 views
5

Đây là nỗ lực của tôi tại một người quản lý mô hình khóa tự nhiên tổng quát. Nó giống như the docs ngoại trừ nó cố gắng (không thành công) để xác định tên trường khóa tự nhiên từ thuộc tính Meta.unique_together.Người quản lý mô hình có thể truy cập thuộc tính Meta của mô hình (`Meta.unique_together`) không?

class NaturalKeyModelManager(Manager): 

    def get_by_natural_key(self, *args): 
     field_dict = {} 
     for i, k in enumerate(self.model.Meta.unique_together[0]): 
      field_dict[k] = args[i] 
     return self.get(**field_dict) 

Nếu tôi chèn một bản in debug ngay trước khi vòng lặp for như thế này:

print dir(self.model.Meta) 

nó không liệt kê các thuộc tính unqiue_together tại tất cả:

['__doc__', '__module__', 'abstract'] 

Các 'trừu tượng' chút lo lắng cho tôi, nhưng một bản in gỡ lỗi khác cho thấy mô hình mà tôi đang cố gắng quản lý bằng các khóa tự nhiên không phải là trừu tượng:

>>> print self.model.Meta.abstract 
False 

Tôi đang pha trộn nhiều lớp cơ bản trừu tượng. Có thể đó là vấn đề?

class MixedModel(NamedModel, TimeStampedModel, VersionedModel, Model): 
    objects = NaturalKeyModelManager() 

    class Meta: 
     unique_together = (('name', 'version',),) 

Đối với đầy đủ ở đây là một trong những mixins:

class TimeStampedModel(Model): 
    created = DateTimeField(_("Created"),  auto_now_add=True, null=True, editable=False) 
    updated = DateTimeField(_("Updated"),  auto_now=True,  null=True, editable=True) 

    class Meta: 
     abstract = True 

Người quản lý mô hình mã hóa cứng làm việc tốt:

class MixedModelManager(Manager): 
    def get_by_natural_key(self, name, version): 
     return self.get(name=name, version=version) 

Trả lời

8

Để có được những lựa chọn thực tế thông qua với meta, bạn nên sử dụng self.model._meta thay vì self.model.Meta

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