Django:无法过滤跨越的关系

时间:2018-05-22 17:13:40

标签: python django django-models django-views

我有一些模型,我想过滤掉特定字段,但我不断收到错误:无法解析关键字'Unique'到字段中。选择是:父,id,唯一。这是我的模型和我的过滤器查找:

    #models

class Parent(models.Model):
    parent_name = models.CharField(max_length=30)
    objects = models.Manager()


class Unique(models.Model):
    unique_name = models.CharField(max_length=10)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE)
    objects = models.Manager()


class Name(models.Model):
    name_name = models.CharField(max_length=20)
    unique = models.ForeignKey(Unique, on_delete=models.CASCADE)
    objects = models.Manager()


class Item(models.Model):
    item_name = models.CharField(max_length=30)
    name = models.ForeignKey(Name, on_delete=models.CASCADE)
    objects = models.Manager()

以下是我一直在尝试的查询:

if Parent.objects.filter(parent_name__iexact = new_parent.parent_name,
        unique__unique_name__iexact = new_unique.unique_name, 
        unique__name__name_name__iexact = new_name.name_name, 
        unique__name__item__item_name__iexact = new_item.item_name).exists():

我想确保数据库中存在跨越ForeignKey关系的某些模型。 New_变量是表单输入。

编辑:我让代码工作,我一定搞砸了一些非常小的东西。目前的代码有效,我将从现在开始使用PEP8来更好地发现错误,谢谢:)

1 个答案:

答案 0 :(得分:1)

如果使用PEP8建议和Django良好实践重写代码,它应如下所示:

class Parent(models.Model):
    parent = models.CharField(max_length=30)


class Unique(models.Model):
    unique = models.CharField(max_length=10)
    parent = models.ForeignKey(Parent, on_delete=models.CASCADE, related_name='uniques')


class Name(models.Model):
    name = models.CharField(max_length=20)
    unique = models.ForeignKey(Unique, on_delete=models.CASCADE, related_name='names')


class Item(models.Model):
    item_name = models.CharField(max_length=30)
    name = models.ForeignKey(Name, on_delete=models.CASCADE, related_name='items')


has_parents = Parent.objects.filter(
    parent__iexact=new_parent.parent,
    uniques__unique__iexact=new_unique.unique,
    uniques__names__name__iexact=new_name.name,
    uniques__names__items__item_name__iexact=new_item.item_name
).exists()

if has_parents:
    do_something()

我甚至建议您更改与模型名称相等的字段。

正如你所看到的,它比你的代码更具可读性,就像Python教徒一样,我们真的很讨厌它。