【问题标题】:Django: Can't filter spanned relationshipsDjango:无法过滤跨区关系
【发布时间】:2018-05-22 17:13:40
【问题描述】:

我有几个模型,我想过滤掉特定字段,但我不断收到错误消息:无法将关键字“唯一”解析到字段中。选项有:父母、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 更好地发现错误,谢谢 :)

【问题讨论】:

  • 我觉得你的字段以大写开头有点奇怪,通常字段都是小写的。
  • 对于过滤,一个父级可以有多个Uniques,所以在这种情况下,默认情况下相反的是unique_set
  • 与问题无关,但你的代码看起来很奇怪,你应该遵循python风格指南:python.org/dev/peps/pep-0008
  • 你也不需要像这样链接过滤器,你可以只有一个 .filter() 并用逗号分隔过滤器。
  • 如果您对模型和字段不使用相同的词,例如父母。父母。使用名称/标题/描述/标识符之类的,因为它是一个字符串。

标签: python django django-models django-views


【解决方案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 主义者,我们真的很讨厌它。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-07-20
    • 1970-01-01
    • 2022-01-03
    • 2020-06-18
    • 2014-12-29
    • 2016-07-23
    • 1970-01-01
    相关资源
    最近更新 更多