Как узнать, является ли столбец модели внешним ключом?

Я динамично храню информацию в базе данных в зависимости от запроса:

// 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 () на столбце внешнего ключа?

12
задан balu 9 April 2010 в 14:01
поделиться

2 ответа

Вы можете использовать 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')

13
ответ дан 2 December 2019 в 19:53
поделиться

Изучите поля «ModelChoiceField». Могут ли они решить вашу проблему, поместив за вас внешние ключи в формы; вместо того, чтобы делать это самостоятельно.

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

record = forms.ModelChoiceField(queryset=table_obj.objects.all())
0
ответ дан 2 December 2019 в 19:53
поделиться
Другие вопросы по тегам:

Похожие вопросы: