Django admin: исключение значений из выпадающего списка с сохранением существующего значения

У меня есть сайт с рейтингами конференций, где FoR-коды являются одним из полей. В базе данных есть старые коды FoR, которые больше не используются. Я хотел бы исключить эти коды из выпадающего меню формы изменений на сайте администратора, поскольку для того, чтобы добраться до текущих кодов, требуется прокрутка (скриншот).

Я попробовал исключить старые коды, переопределив formfield_for_foreignkey, как показано в приведенном ниже фрагменте кода. Однако если в админке открыть запись конференции со старым кодом, то выпадающий список кодов FoR очищается (скриншот).

Можно ли исключить старые коды FoR, сохранив при этом код FoR для старых записей? В примере, на который я ссылался выше (1, 2), я хочу сохранить код 0905 для старой записи, а для новых записей показывать только текущие коды.

#admin.py
class RankInline(admin.TabularInline):
    model = Rank
    extra = 1

    def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "for":
            kwargs["queryset"] = ForCode.objects.filter(code__startswith="46")
        return super(RankInline, self).formfield_for_foreignkey(db_field, request, **kwargs)
    
    
class CommentInLine(admin.TabularInline):
    model = Comment
    extra = 0


class ConferenceAdmin(admin.ModelAdmin):
    list_display = ("acronym", "title", "url")
    list_display_links = ("acronym", "title", "url")
    search_fields = ("acronym", "title", "url")
    inlines = (RankInline, CommentInLine)
#models.py
class ForCode(models.Model):
    code = models.CharField(max_length=6, primary_key=True)
    name = models.TextField()
    source = models.ForeignKey(Source, on_delete=models.CASCADE)

class Rank(models.Model):
    conference = models.ForeignKey(Conference, on_delete=models.CASCADE)
    source = models.ForeignKey(Source, on_delete=models.CASCADE)
    rank = models.CharField(max_length=255)
    for_code = models.ForeignKey(ForCode, db_column="for", null=True, blank=True, on_delete=models.SET_NULL)
Вернуться на верх