Как переопределить набор запросов, используемый Django admin / form для внешнего ключа - PullRequest
0 голосов
/ 29 января 2020

Я перепробовал все, что могу найти в inte rnet здесь, и, похоже, ничего не работает, так что интересно, много ли предыдущих ответов было для старых версий. Я на Django 2.2.9.

#models.py

class ParentModel(models.Model):
   title = models.CharField()

class ChildModel(models.Model):
   parent = models.ForeignKey(
        ParentModel,
        on_delete=models.CASCADE,
        related_name='parent'
    )

# admin.py

@admin.register(ParentModel)
class ParentModelAdmin(admin.ModelAdmin):
    model = ParentModel

    def get_queryset(self, request):
        return ParentModel.objects.get_complete_queryset()


class ChildModelForm(forms.Form):
    def __init__(self, u, *args, **kwargs):
        super(ChildModelForm, self).__init__(*args, **kwargs)
        self.fields['parent'].queryset = ParentModel.objects.get_complete_queryset()

    class Meta:
        model = ChildModel
        fields = '__all__'


@admin.register(ChildModel)
class ChildModelAdmin(admin.ModelAdmin):
   model = ChildModel
   form = ChildModelForm

   def formfield_for_foreignkey(self, db_field, request, **kwargs):
        if db_field.name == "parent":
            kwargs["queryset"] = ParentModel.objects.get_complete_queryset()

        return super().formfield_for_foreignkey(db_field, request, **kwargs)

У меня есть запрос менеджера с именем get_complete_queryset на ParentModel, который возвращает более широкий набор Parents, чем по умолчанию queryset.

Приведенная выше настройка позволяет мне go к моим ChildModelAdmin и выбрать «скрытых» родителей из выпадающего списка, но когда я пытаюсь сохранить их, появляется следующая ошибка:

parent instance with id 2 does not exist.

Должен быть какой-то набор запросов, который форма использует для сохранения модели, которая не переопределяется, но я не могу найти, что это такое.

...