2010-08-07 6 views
0

В моем приложении, у меня есть определение модели, как:Использование CONTENTTYPE для raw_id_fields

class SomeModel(models.Model): 
    someFK = Models.ForeignKey(SomeModel, null=True, blank=True) 
    otherFK = Models.ForeignKey(OtherModel, null=True, blank=True) 
    ... 

Эта модель сохранить данные о журналах, и есть более чем 1 вид модели быть авторизованы, поэтому я поместить FK для каждой связанной модели. Для каждой записи используется только один из FK, другой FK установлен NULL = True.

Но я не хочу изменять свою модель, когда мне нужно записывать некоторые другие вещи. Так что я изменить свою модель так:

class SomeModel(models.Model): 
    content_type = models.ForeignKey(ContentType) 
    content_id = models.IntegerField() 

Так я использовал следующее, чтобы получить то, что я хочу:

content_type.get_object_for_this_type(id=content_id) 

Его ок. Но когда admin.py входит в игру, это вызывает проблемы, потому что у меня есть 1.000.000+ данных для некоторых связанных моделей, которые должны быть зарегистрированы, поэтому мне нужно использовать raw_id_fields. Поскольку у меня нет FK для каждой связанной модели, я должен использовать ContentType model и content_id, но я не знаю, как это сделать с помощью ContentType?

ответ

1

Я знаю, что это точно не отвечает на ваш вопрос, но вы должны использовать общие отношения вместо нескольких дополнительных ключей. Тогда вы можете достичь конечной цели того, что вам нужно.

+0

Как я уже сказал, мои модели не содержат FK для каждой модели, а модель типа Fk для xontent, поле для идентификатора связанного объекта и genetricFK. Но поскольку genericFk не имеет представления поля в db, он имеет множество ограничений, и я не могу использовать GenericFK в admin.py – FallenAngel

2

Django grappelli расширяет функциональность администратора Django в generic lookup. Так что ваш ModelAdmin может иметь что-то вроде:

class SomeModelAdmin(ModelAdmin): 
    related_lookup_fields = { 
     'generic': [['content_type', 'object_id'], ], 
    } 

Result

Это решает мою проблему поиска. Надеюсь, это тоже решит вашу проблему.

Смежные вопросы