Я динамично храню информацию в базе данных в зависимости от запроса:
// 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'])
Проблемой является тот запрос. POST ['значение'] иногда содержит первичный ключ внешней записи (т.е. целое число), тогда как Django ожидает, что значение столбца будет объектом типа ForeignModel:
Не может присвоить "u '122'": "ModelA.b" должен быть экземпляром "ModelB".
Теперь, существует ли изящный способ динамично проверить, является ли b столбцом, содержащим внешние ключи и с какой моделью эти ключи связаны? (Так, чтобы я мог загрузить внешнюю запись, он - первичный ключ, и присвойте его ModelA?) Или разве Django не предоставляет информацию как это программисту, таким образом, я действительно должен пачкать руки и использовать isinstance () на столбце внешнего ключа?
Вы можете использовать get_field_by_name в объектах _meta моделей:
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, вы бы использовали это так:
fk_model = get_fk_model(MyModel, 'fieldname')
Изучите поля «ModelChoiceField». Могут ли они решить вашу проблему, поместив за вас внешние ключи в формы; вместо того, чтобы делать это самостоятельно.
http://docs.djangoproject.com/en/1.1/ref/forms/fields/#fields-which-handle-relationships
record = forms.ModelChoiceField(queryset=table_obj.objects.all())