Джанго: не может фильтровать натянутые отношения - PullRequest
0 голосов
/ 22 мая 2018

У меня есть несколько моделей, и я хотел бы отфильтровать определенные поля, но я получаю сообщение об ошибке: не удается разрешить ключевое слово «Unique» в поле.Варианты: Родитель, Идентификатор, Уникальный.Вот моя модель и мой фильтр:

    #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_ являются входными данными формы.

edit: я получил код для работы, я, должно быть, испортил что-то довольно маленькое.Текущий код работает, и теперь я буду использовать PEP8, чтобы лучше находить ошибки, спасибо:)

1 Ответ

0 голосов
/ 22 мая 2018

Если вы переписываете свой код, используя рекомендации 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()

Я даже рекомендую вам изменить те поля, которые были равны названию модели.

Как вы можете видеть, он гораздо более читабелен, чем ваш код, как Pythonists, мы действительно раздражаем его.

...