Как реализовать данную сущность моделей в 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.