【问题标题】:How can I filter foreignkeys in models?如何过滤模型中的外键?
【发布时间】:2019-05-24 18:13:16
【问题描述】:

我创建了两个模型,Porumbei 和 Perechi。 Porumbei的意思是鸽子,它可以是雄性或雌性,它们成对生活(Perechi)。下面是我的模型(部分)

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(pair) 时,我想将字段 mascul 与 Porumbei(pigeons) 中的所有雄性进行排序,一旦它被添加到对中,下次添加要排除的雄性对时列出,因为它已经有对。与女性相同。我该如何实现?

【问题讨论】:

  • 在性别模型中你有字段名吗?男性/女性写在哪里?
  • 其中提供了哪些值?
  • 我刚刚编辑了带有性别类别的帖子。
  • 同性恋对呢? ;-)
  • 在繁育鸽子时,拥有同性恋配对是没有效率的。 :)

标签: python django


【解决方案1】:

您可以使用ForeignKeylimit_choices_to 参数直接限制选择:

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"))

Here 的文档。

使用related_name还可以查询反向关系:

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

会给你尚未配对的雄鸽。

【讨论】:

  • 我必须在哪里使用它?在模型中还是在表单定义中?
  • 它给了我 TypeError: cannot unpack non-iterable Porumbei object when render the page。我使用表单、视图和模板编辑了帖子。提前致谢。
  • 完整的错误跟踪?不确定你在做什么。你的表单只是一个简单的Form,所以你不能form.save()(因为你需要一个ModelForm。但这不是错误的来源
  • TypeError at /perechi/adauga-pereche/ cannot unpack non-iterable Porumbei object Request Method: GET Request URL: 127.0.0.1:8000/perechi/adauga-pereche Django Version: 2.2.1 Exception Type: TypeError Exception Value: cannot unpack non -iterable Porumbei 对象我认为问题出在选择字段上,因为在没有这两个字段 mascul 和 femela 的情况下重新渲染,模板被渲染
猜你喜欢
  • 1970-01-01
  • 2018-02-03
  • 2013-09-23
  • 2012-07-15
  • 2018-03-19
  • 1970-01-01
  • 2016-06-10
  • 2016-07-07
  • 2019-06-30
相关资源
最近更新 更多