Как добавить условие к внешнему ключу модели Django?

#django

#django

Вопрос:

Я новичок в Django, не могли бы вы мне помочь, у меня есть две модели, по названию континента и страны, в форме страны я хочу отображать только континенты в выпадающем списке, статус которых соответствует true?

Модели

     from django.db import models
    from smart_selects.db_fields import GroupedForeignKey, ChainedForeignKey
    
    
    class Continent(models.Model):
        name = models.CharField(max_length=255)
        status=models.BooleanField(default=True)
    
        def __str__(self):
            return self.name
    
    class Country(models.Model):
        continent = models.ForeignKey(Continent, null=True, on_delete=models.SET_NULL)
        status=models.BooleanField(default=True)
        name = models.CharField(max_length=255)
        
        def __str__(self):
            return self.name
  

формы

     class FormContinent(ModelForm):
        class Meta:
            model = Continent
            fields = '__all__'
    
    class FormCountry(ModelForm):
        class Meta:
            model = Country
            fields = '__all__'
  

число просмотров

 def continent(request):
    form = FormContinent()
    if request.method == 'POST':
        form = FormContinent(request.POST)
        form.is_valid()
        form.save()
        return redirect('/continent')
    else:
        context = {'form': form}
        return render(request, 'continent.html', context)


def country(request):
    form = FormCountry()
    if request.method == 'POST':
        form = FormCountry(request.POST)
        form.is_valid()
        form.save()
        return redirect('/country')
    else:
        context = {'form': form}
        return render(request, 'country.html', context)
  

Ответ №1:

Вы можете использовать limit_choices_to=… параметр [Django-doc]:

 class Country(models.Model):
    continent = models.ForeignKey(
        Continent,
        # ↓ limit choices to Continents with status=True
        limit_choices_to={'status': True},  
        null=True,
        on_delete=models.SET_NULL
    )
    # …