2009-11-20 2 views
5

Nếu mô hình django được làm trừu tượng, như dưới đây, có cách nào để kiểm tra lớp để xác định rằng lớp đó trừu tượng không?Django - cách xác định xem lớp mô hình có trừu tượng hay không

class MyModel(models.Model): 
    class Meta: 
    abstract = True 

Tôi hy vọng rằng tôi có thể kiểm tra MyModel.Meta.abstract, nhưng theo Django tài liệu:

Django hiện làm cho một điều chỉnh đến lớp Meta của một lớp cơ sở trừu tượng: trước khi cài đặt Thuộc tính meta, nó đặt abstract = False. Điều này có nghĩa là trẻ em của các lớp cơ sở trừu tượng không tự động trở thành các lớp trừu tượng.

Bất kỳ ý tưởng nào? Cảm ơn!

+0

Có vấn đề gì khi đọc nguồn? Nó luôn luôn có sẵn. –

+0

Tóm tắt từ các tài liệu liên quan đến lớp dẫn xuất 'Meta, không phải của cơ sở. –

+1

@ S.Lott - Thật vậy, tôi RTFM nhưng không thành công với RTFS. Để công bằng, nhiều câu hỏi về S.O. có thể có thể tự trả lời bằng cách đọc nguồn. @Dmitry - Tôi hơi bối rối trước nhận xét của bạn. Từ django/db/basy.py, có vẻ như tất cả các thuộc tính trong lớp Meta được chuyển đến một lớp mới được tham chiếu như _meta. Đây là lớp chứa giá trị trừu tượng ban đầu được đặt trong các lớp Meta của mô hình. Bất kể, @sheats đã trả lời câu hỏi của tôi (Cảm ơn một lần nữa). – Nagyman

Trả lời

12

Bạn có thể khởi tạo MyModel và sau đó kiểm tra ._meta.abstract.

Vì vậy, trong mã:

m = MyModel() 
print m._meta.abstract 
+0

Tôi đã không phát hiện ra rằng trong dir (MyModel), nhưng nó ở đó. Cảm ơn rất nhiều. – Nagyman

+1

Nếu bạn chưa xem xét iPython, tôi sẽ khuyên bạn nên sử dụng nó. Nó rất hữu ích để chơi xung quanh và tìm ra những điều này vì nó cung cấp tự động hoàn thành. Đó là cách tôi tìm thấy cái này =) – sheats

+0

Việc truy cập vào một thành viên được bảo vệ từ bên ngoài bằng Python có bình thường không? – sergzach

1

tôi muốn chỉ ra rằng bạn không cần phải nhanh chóng một mô hình để kiểm tra xem nó là trừu tượng - mô hình Django kế thừa một metaclass thực tế có thêm _meta trên lớp instantiation .

Vì vậy, tương tự như mã @ sheats của, hãy thử

from django.db.models import Model 
class MyModel(Model): 
    pass 
print MyModel._meta.abstract 

Hoặc, cho một ví dụ tích cực

from django.db.models import Model 
class MyModel(Model): 
    class Meta(object): 
    abstract = True 
print MyModel._meta.abstract 

Tất nhiên, điều này cũng làm việc cho các mô hình được xây dựng trong và bất cứ điều gì kế thừa từ mẫu của Django .

from django.contrib.auth.models import User 
print User._meta.abstract