2009-12-04 26 views
32

Làm cách nào để có được tất cả tên bảng trong ứng dụng Django?Nhận tất cả tên bảng trong ứng dụng Django

tôi sử dụng đoạn mã sau nhưng nó không nhận được các bảng được tạo ra bởi ManyToManyField

from django.db.models import get_app, get_models 
app = get_app(app_name) 
for model in get_models(app): 
    print model._meta.db_table 

Trả lời

54
from django.db import connection 
tables = connection.introspection.table_names() 
seen_models = connection.introspection.installed_models(tables) 

Như đã thấy trong lệnh syncdb cho manage.py.

Trong một bình luận dưới đây, năm sau khi câu trả lời ở trên, ThePhi nói (tôi đã không kiểm tra nó):

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() 
+0

Đã chỉnh sửa để bao gồm cơ chế chỉ nhận các mẫu ứng dụng đã cài đặt. Tôi thực sự khuyên bạn nên xem mã lệnh syncdb. – cethegeek

+0

Câu trả lời này liệt kê tất cả các bảng mà django của tôi đã từng sử dụng, bao gồm cả những bảng được tạo bởi các ứng dụng đã từng có trong INSTALLED_APPS nhưng không còn nữa. Có cách nào để tìm ra những cái hiện có liên quan không? – GreenAsJade

+0

Để tham khảo trong tương lai: https://stackoverflow.com/a/31184258/1937033 Từ Django 1.7 trên, bạn có thể sử dụng mã này, ví dụ trong admin.py của bạn để đăng ký tất cả các mô hình: 'từ django.apps ứng dụng nhập từ django.contrib nhập khẩu quản trị từ django.contrib.admin.sites nhập AlreadyRegistered app_models = apps.get_app_config get_models() cho mô hình trong app_models ('my_app'): thử:. admin.site.register (model) except AlreadyRegistered: pass' – ThePhi

0

Phương pháp đơn giản nhất nên sử dụng các API cơ sở dữ liệu phản ánh trong django để đi trực tiếp vào cơ sở dữ liệu. Nhược điểm của việc này là nó sẽ không cung cấp cho bạn bất kỳ bảng nào trước khi bạn đồng bộ hóa.

9

Câu trả lời đơn giản nhất, mà vẫn cho phép bạn chọn ứng dụng nào bạn muốn, là để sửa đổi mã của bạn với một đối số bổ sung "include_auto_created".

from django.db.models import get_app, get_models 
app = get_app(app_name) 
for model in get_models(app, include_auto_created=True): 
    print model._meta.db_table 

Rõ ràng tôi nhận này bằng cách làm theo những lời khuyên celope để đọc các nguồn syncdb, do đó, nhờ đó - chỉ cần ghi lại một câu trả lời chính xác mà bao gồm tên ứng dụng vì nó là những gì tôi muốn và những người khác có thể quá trong tương lai.

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