2012-01-02 20 views
41

Vì vậy, tôi có một models.py tập tin trong thư mục MyApp:Django có được danh sách các mô hình trong ứng dụng

from django.db import models 
class Model_One(models.Model): 
    ... 
class Model_Two(models.Model): 
    ... 
... 

Nó có thể là khoảng 10-15 lớp. Cách tìm tất cả các mô hình trong MyApp và nhận tên của chúng?

Vì mô hình không thể lặp lại được, tôi không biết điều này có thể xảy ra hay không.

+2

@downvoter, muốn chia sẻ lý do bạn downvoted? Không có gì sai với câu hỏi này (+1 để làm cho cân bằng) – juliomalegria

+0

Tôi không đồng ý với downvote. Grep không phù hợp nếu bạn muốn biết các mô hình trong thời gian chạy. Get_app và get_models hoàn hảo trong trường hợp đó. – Alasdair

+0

"biết các mô hình tại thời gian chạy"? Điều đó có nghĩa là gì? –

Trả lời

81

CẬP NHẬT

cho các phiên bản mới hơn của Django kiểm tra Sjoerd câu trả lời dưới đây

câu trả lời gốc từ năm 2012: Đây là cách tốt nhất để thực hiện những gì bạn muốn làm:

from django.db.models import get_app, get_models 

app = get_app('my_application_name') 
for model in get_models(app): 
    # do something with the model 

Trong ví dụ này, model là mô hình thực tế, vì vậy bạn có thể làm rất nhiều thứ với nó:

for model in get_models(app): 
    new_object = model() # Create an instance of that model 
    model.objects.filter(...) # Query the objects of that model 
    model._meta.db_table # Get the name of the model in the database 
    model._meta.verbose_name # Get a verbose name of the model 
    # ... 
+1

Cảm ơn rất nhiều, nó hoạt động) – Feanor

+1

@ user1126473 vui vì tôi đã giúp :) – juliomalegria

+10

Kể từ django 1.7, bạn nên sử dụng hệ thống tải ứng dụng mới: 'từ django.apps nhập apps' chứa các phương pháp này. 'django.db.models.loading' sẽ bị xóa trong django 1.9. – Ben

41

Từ Django 1,7 trên, bạn có thể sử dụng mã này, ví dụ như trong admin.py của bạn để đăng ký tất cả các mô hình:

from django.apps import apps 
from django.contrib import admin 
from django.contrib.admin.sites import AlreadyRegistered 

app_models = apps.get_app_config('my_app').get_models() 
for model in app_models: 
    try: 
     admin.site.register(model) 
    except AlreadyRegistered: 
     pass 
1

Một cách khác là sử dụng Content Types.

Mỗi mô hình cho mỗi ứng dụng trong INSTALLED_APPS nhận được một mục nhập trong các kiểu ContentType. Điều này cho phép bạn, ví dụ, để có một chìa khóa nước ngoài cho một mô hình.

>>> from django.contrib.contenttypes.models import ContentType 
>>> ContentType.objects.filter(app_label="auth") 
<QuerySet [<ContentType: group>, <ContentType: permission>, <ContentType: user>]> 
>>> [ct.model_class() for ct in ContentType.objects.filter(app_label="auth")] 
[<class 'django.contrib.auth.models.Group'>, <class 'django.contrib.auth.models.Permission'>, <class 'django.contrib.auth.models.User'>] 
5

câu trả lời tốt nhất tôi tìm thấy để có được tất cả các mô hình từ ứng dụng:

from django.apps import apps 
apps.all_models['<app_name>'] #returns dict with all models you defined 
0

Dưới đây là một giải pháp nhanh chóng-và-bẩn, không có mã hóa sử dụng dumpdatajq:

python manage.py dumpdata oauth2_provider | jq -r '.[] | .model' | uniq 

Bạn cũng có thể xóa lệnh jq để nhận định dạng theo ý thích của mình.


Bonus: bạn có thể thấy số lượng các loại khác nhau của các đối tượng bằng cách thêm -c cờ để uniq.

+0

@Feanor https://meta.stackexchange.com/questions/121908/i-know-this-question-is-like-two-years-old-but – mgalgs

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