Вложенные формы Django для внешних ключей
У меня есть следующие модели Django:
class Color(models.Model):
label = models.CharField(max_length=255, unique=True)
class ColorAnnotation(models.Model):
color = models.ForeignKey(Color)
confidence = models.FloatField()
def __str__(self):
return f"{self.color.label} {round(self.confidence, 2) if self.confidence else None}"
class Annotation(models.Model):
color = models.ForeignKey(ColorAnnotation)
Поскольку у меня много записей, Django Admin стал очень медленным при загрузке одной записи модели Annotation
, потому что он пытался загрузить все возможные значения __str__
для ColorAnnotation
. Я оптимизировал, используя prefetch_related
и select_related
, но это не помогло.
Я решил эту проблему, создав пользовательские froms.ModelForm
:
class AnnotationForm(forms.ModelForm):
color = forms.ChoiceField(required=False, choices=Color.objects.values_list('id', 'label'))
class Meta:
model = Annotation
fields = '__all__'
class AnnotationAdmin(admin.ModelAdmin):
list_display = ("id", "color")
list_filter = (
("color__color__label", custom_titled_filter('Color'))
)
form = AnnotationForm
def get_queryset(self, request):
queryset = super().get_queryset(request)
return queryset.prefetch_related(
'color__color',
).select_related(
'color',
).all()
Это работает хорошо, но не показывает атрибут confidence
экземпляра ColorAnnotation
данного Annotation
:
Я хотел бы изменить это так, чтобы у меня было выпадающее меню для Color
, но с возможностью изменения confidence
тоже.
Мне интересно, есть ли способ создать пользовательскую форму forms.ModelForm
для модели ColorAnnotation
и использовать ее как вложенную форму в AnnotationForm
.