2010-04-09 6 views
11

내가 동적으로 저장하고있어 정보 :모델의 열이 외래 키인지 확인하는 방법은 무엇입니까? 요청에 따라 데이터베이스에

// table, id and column are provided by the request 
table_obj = getattr(models, table) 
record = table_obj.objects.get(pk=id) 

setattr(record, column, request.POST['value']) 

문제는 request.POST는 [ '값'] 가끔 외국 레코드의 기본 키를 포함 (즉 정수) 장고가 기대하는 반면, 열의 값이 ForeignModel 유형의 객체가됩니다.

"ModelA.b"는 "ModelB"인스턴스 여야합니다.

이제 b가 외래 키를 포함하는 열인지 여부와이 키가 연결된 모델을 동적으로 확인하는 우아한 방법이 있습니까? 그래서 외래 레코드를 기본 키로하여 ModelA에 할당 할 수 있습니까? 아니면 장고가 이런 정보를 프로그래머에게 제공하지 않도록해야합니다. 그래서 정말 내 손을 더러워야하고 외래 거래에 대한 isinstance()를 사용해야합니다. 키 열?

답변

13

당신은 객체 _meta 모델에 get_field_by_name를 사용할 수 있습니다

 

fk_model = get_fk_model(MyModel, 'fieldname') 
 
+0

'model' 입력이'field_object, model_direct, m2m = ...'할당에 의해 덮어 쓰이지 않을까요? – alvas

+0

제 생각 엔, 다시는 사용하지 않았으므로 큰 문제는 아닙니다. –

0

"ModelChoiceField"필드를 탐색하십시오. 외국 열쇠를 당신의 형태로 넣는 문제를 해결할 수 있습니까? 너 자신을하기보다는.

http://docs.djangoproject.com/en/1.1/ref/forms/fields/#fields-which-handle-relationships

record = forms.ModelChoiceField(queryset=table_obj.objects.all()) 
+0

덕분에, 내가 할 것이라고 나는 특별한 요구 사항을 가지고 있지 않은 경우 : 내 모든 "형태"이다는 JS-전원 인라인 편집 양식을. 따라서 장고의 API로 생성하는 것이 꽤 어렵습니다. 내가 선호하는 API는 아닙니다. – balu

1

I을 :

 

from django.db.models import ForeignKey 

def get_fk_model(model, fieldname): 
    '''returns None if not foreignkey, otherswise the relevant model''' 
    field_object, model, direct, m2m = model._meta.get_field_by_name(fieldname) 
    if not m2m and direct and isinstance(field_object, ForeignKey): 
     return field_object.rel.to 
    return None 
 

당신은 따라서이을 사용 MyModel 당신이 모델 클래스를 가지고 가정 동일한 사용 사례가 발생했으며 허용 된 답변이 나를 위해 작동하지 않았습니다. dir 요. 관련성이있는 경우 Django 1.2를 사용하고 있습니다. 대신 다음과 같이 get_field_by_name 메서드를 사용했습니다.

def get_foreign_keys(self): 
     foreign_keys = [] 
     for field in self._meta.fields: 
      if isinstance(self._meta.get_field_by_name(field.name)[0], models.ForeignKey): 
       foreign_keys.append(field.name) 

     if not foreign_keys: 
      return None 
     return foreign_keys 

이것은 클래스 내부에서 정의되는 메소드입니다. 내 경우에 필요한 것은 ForeignKey 필드의 이름입니다. 건배!

In [8]: relations = [f for f in Model._meta.get_fields() if (f.one_to_many or f.one_to_one) and f.auto_created] 

위가 relations으로 모든 modelslist을 줄 것이다 :

1

간단한 하나 라이너는 model에있는 다른 models 모든 관계를 찾을 수 있습니다.

예 :

In [9]: relations 
Out[9]: 
[<ManyToOneRel: app1.model1>, 
<ManyToOneRel: app2.model1>, 
<OneToOneRel: app1.model2>, 
<OneToOneRel: app3.model5>, 
<OneToOneRel: app5.model1>] 
관련 문제