2010-03-05 20 views
35

Tôi đang cố gắng lấy thông tin về lớp trên một trường bên trong một mô hình, khi tôi chỉ biết tên của trường và tên của mô hình (cả hai chuỗi đồng đều). Làm thế nào là nó có thể?Làm thế nào để nhìn vào các trường mô hình django?

tôi có thể tải các mô hình tự động:

from django.db import models 
model = models.get_model('myapp','mymodel') 

Bây giờ tôi đã thực địa - 'myfield' - làm thế nào tôi có thể nhận lớp của cánh đồng đó?

Nếu trường có quan hệ - cách nhận trường liên quan?

Cảm ơn một nhóm!

+0

Câu hỏi hay. Điều này đã lưu ass của tôi – GabiMe

Trả lời

70

Bạn có thể sử dụng thuộc tính _meta của mô hình để lấy đối tượng trường và từ trường, bạn có thể nhận được mối quan hệ và nhiều hơn nữa, ví dụ: xem xét một bảng nhân viên trong đó có một khóa ngoại đến một bảng phận

In [1]: from django.db import models 

In [2]: model = models.get_model('timeapp', 'Employee') 

In [3]: dep_field = model._meta.get_field_by_name('department') 

In [4]: dep_field[0].rel.field_name 
Out[4]: 'id' 

In [5]: dep_field[0].rel.to 
Out[5]: <class 'timesite.timeapp.models.Department'> 

từ django/db/mô hình/options.py

def get_field_by_name(self, name): 
    """ 
    Returns the (field_object, model, direct, m2m), where field_object is 
    the Field instance for the given name, model is the model containing 
    this field (None for local fields), direct is True if the field exists 
    on this model, and m2m is True for many-to-many relations. When 
    'direct' is False, 'field_object' is the corresponding RelatedObject 
    for this field (since the field doesn't have an instance associated 
    with it). 

    Uses a cache internally, so after the first access, this is very fast. 
    """ 
+1

có, cảm ơn bạn get_field_by_name và các chức năng khác được xác định trong django/db/models/options.py (trong v1.1.1) – Evgeny

4

Câu trả lời từ Anurag Uniyal sử dụng get_field_by_name tại là (5 năm sau này) đã lỗi thời vì get_field_by_name không còn được dùng nữa. Django sẽ cung cấp cho bạn những gợi ý sau đây:

RemovedInDjango110Warning: 'get_field_by_name là một API không chính thức rằng đã bị phản đối. Bạn có thể thay thế nó bằng 'get_field()'

tài liệu API cho get_fieldhere.

1

Nếu bạn muốn xem TẤT CẢ các trường trên đối tượng mô hình Django, bạn có thể đơn giản quan sát nó bằng cách gọi ._meta.get_fields() trên lớp (hoặc đối tượng mô hình đã được khởi tạo) để lấy danh sách tất cả các trường. API này hiện tại với phiên bản mới nhất của Django.

Ví dụ:

from django.contrib.auth.models import User 
User._meta.get_fields() 

này sẽ trả về một tuple của tất cả các lĩnh vực người mẫu. Tài liệu có thể được tìm thấy HERE.

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