Как я могу фильтровать иностранные клавиши в моделях? - PullRequest
0 голосов
/ 24 мая 2019

Я создал две модели, Порумбей и Перечи.Порумбей означает голубь, и это может быть мужчина или женщина, они живут парами (перечи).Мои модели ниже (часть этого)

class Gender(models.Model):
    sexul = models.CharField(max_length=20, null=False, blank=False)
    def __str__(self):
        return self.sexul


class Porumbei(models.Model):
    ....
    serie_inel = models.CharField(....)
    sex = models.ForeignKey(Gender, on_delete=models.CASCADE)
    ....

class Perechi(models.Model):
    ....
    mascul = models.ForeignKey(Porumbei, on_delete=models.CASCADE)
    femela = models.ForeignKey(Porumbei, on_delete=models.CASCADE)

My form:

class AdaugaPereche(forms.Form):
    boxa = forms.IntegerField(label="Boxa", min_value=1)
    sezon = forms.CharField(label="Sezon reproducere", initial=datetime.now().year)
    mascul = forms.ChoiceField(choices=Porumbei.objects.filter(sex__sexul="Mascul", perechi_masculi__isnull=True), label="Mascul")
    femela = forms.ChoiceField(choices=Porumbei.objects.filter(sex__sexul="Femelă", perechi_femele__isnull=True), label="Femela")
    serie_pui_1 = forms.CharField(label="Serie pui 1")
    serie_pui_2 = forms.CharField(label="Serie pui 2")
    culoare_pui_1 = forms.ChoiceField(choices=CuloriPorumbei.objects.all(), label="Culoare pui 1")
    culoare_pui_2 = forms.ChoiceField(choices=CuloriPorumbei.objects.all(), label="Culoare pui 2")
    data_imperechere = forms.DateField(label="Dată împerechere")
    primul_ou = forms.DateField(label="Primul ou")
    data_ecloziune = forms.DateField(label="Dată ecloziune")
    data_inelare = forms.DateField(label="Dată inelare")
    comentarii = forms.Textarea()

My view:

def perechenoua(request):
if request.method == "POST":
    form = AdaugaPereche(request.POST)
    if form.is_valid():
        form.save()
        return redirect("porumbei")
else:
    form = AdaugaPereche()
context = {
    'form': form
}
template = loader.get_template("adauga_pereche.html")
return HttpResponse(template.render(context, request))

The template:

<form method="post">{% csrf_token %}
    <div class="form-group row">
        <div class="col-sm-3">
            {{ form.boxa|add_class:"form-control" }}
        </div>
        <div class="col-sm-3">
            {{ form.sezon|add_class:"form-control" }}
        </div>
    </div>
    <div class="form-group row">
        <div class="col-sm-3">
            {{ form.mascul|add_class:"form-control custom-select d-block w-100" }}
        </div>
        <div class="col-sm-3">
            {{ form.femela|add_class:"form-control custom-select d-block w-100" }}
        </div>
    </div>
    <div class="form-group row">
        <div class="col-sm-3">
            {{ form.serie_pui_1|add_class:"form-control" }}
        </div>
        <div class="col-sm-3">
            {{ form.serie_pui_2|add_class:"form-control custom-select d-block w-100" }}
        </div>
     </div>
     <div class="form-group row">
         <div class="col-sm-3">
             {{ form.culoare_pui_1|add_class:"form-control custom-select d-block w-100" }}
         </div>
         <div class="col-sm-3">
             {{ form.culoare_pui_2|add_class:"form-control custom-select d-block w-100" }}
         </div>
     </div>
     <div class="form-group row">
         <div class="col-sm-3">
             {{ form.data_imperechere }}
         </div>
         <div class="col-sm-3">
             {{ form.primul_ou }}
         </div>
     </div>
     <div class="form-group row">
         <div class="col-sm-3">
             {{ form.data_ecloziune }}
         </div>
         <div class="col-sm-3">
             {{ form.data_inelare }}
         </div>
     </div>
     <div class="form-group row">
         <div class="col-sm-3">
             {{ form.comentarii }}
         </div>
     </div>
</form>

Когда я создаю новую Perechi (пару), мужское поле, я хочу быть отсортированным со всеми мужчинами в Порумбее (голуби), и как только он был добавлен впары, в следующий раз при добавлении пар этого мужчины следует исключить из списка, поскольку у него уже есть пара.То же самое с женщиной.Как я могу это реализовать?

1 Ответ

0 голосов
/ 24 мая 2019

Вы можете использовать limit_choices_to аргумент ForeignKey для непосредственного ограничения выбора:

from django.db.models import Q

mascul = models.ForeignKey(Porumbei, on_delete=models.CASCADE,
   limit_choices_to=Q(sex__sexul="male",
   related_name="pairs_as_male"))

Здесь документация.

Сrelated_name Вы также можете запросить обратную связь:

Porumbei.objects.filter(sex__sexul="male", pairs_as_male__isnull=True)

даст вам голубей-самцов, которые еще не спарены.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...