Как реализовать данную сущность моделей в Django?

имеется модель Country, например, с такими полями:

class Country(models.Model):
    name = models.CharField(max_length=255)

Также имеется модель Continent, у которой такие поля:

class Continent(models.Model):
    country = models.ManyToManyField(Country)
    name = models.CharField(max_length=255)

И имеется третья модель, пусть будет Location. У нее есть поля country и continent, при чем в обоих этих полях можно вести только одно значение, то есть связь должна быть ForeignKey. И поле country должно зависеть от привязанных значений к выбранному на текущий момент continent. То есть при выборе country там должны быть доступны только те страны, который были привязан к выбранному на данный момент continent. Как такое можно организовать и привязать к админке Django?

Рекомендую использовать виджет ModelChoiceField для поля country в модели Location. В методе __init__ формы для этого поля можно установить queryset на основе выбранного значения для поля continent.

class LocationForm(forms.ModelForm):
    def __init__(self, *args, **kwargs):
        super().__init__(*args, **kwargs)
        continent = self.data.get('continent')
        if continent:
            continent = Continent.objects.get(pk=continent)
            self.fields['country'].queryset = continent.countries.all()
        else:
            self.fields['country'].queryset = Country.objects.none()

    class Meta:
        model = Location
        fields = ['continent', 'country']

Чтобы это организовать и привязать к админке Django возьмите LocationForm в классе ModelAdmin для модели Location:

class LocationAdmin(admin.ModelAdmin):
    form = LocationForm

admin.site.register(Location, LocationAdmin)

Это заставит Django использовать ваш форму в админке вместо стандартной. Когда пользователь выбирает значение для поля continent, queryset для поля country будет обновляться в соответствии с выбранным значением для continent.

Вернуться на верх