Получение списка значений из записей внуков
Я пытаюсь получить доступ к записям внуков в списке, чтобы избежать дублирования записей. В данном примере тег может быть использован только один раз в статьях для данного автора. Я буду использовать полученный список записей о внуках в моей чистой функции для возврата ошибок валидации.
class Article(models.Model):
tag = models.ManyToManyField(Tag)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
class Tag(models.Model):
class Author(models.Model):
Прямо сейчас я могу сделать следующее:
print(author.articles.first().tag.first())
Travel
Я хотел бы иметь возможность использовать что-то вроде author.articles.tags.all() для возврата списка и проверки отправленной формы на соответствие этому списку, чтобы выдать пользователю сообщение ValidationError.
Как это можно сделать эффективно с помощью базовой настройки Many-to-Many без создания промежуточной таблицы для отношений тегов? Это делается исключительно в интерфейсе администратора, если это вообще имеет значение.
я пришел по ссылке, которую вы разместили на upwork,
как я понимаю ваш вопрос,
то, чего вы хотите достичь, кажется невозможным,
Что, как мне кажется, может работать, так это выборка статей, связанных с автором, с соответствующими тегами,
после того, как они получены, вы выполняете фильтрацию и удаляете дубликаты.
иначе метке нечего связывать с автором,
Если мой код выглядит следующим образом
class Author(models.Model):
name = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Tag(models.Model):
tag_val = models.CharField(max_length=255)
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
class Article(models.Model):
author = models.ForeignKey(Author,related_name='articles', on_delete=models.CASCADE)
tags = models.ManyToManyField(Tag, related_name='articles')
created_at = models.DateTimeField(auto_now_add=True)
updated_at = models.DateTimeField(auto_now=True)
Я могу написать запрос следующим образом, предполагая, что переменной 'author' был присвоен экземпляр объекта Author, и получить не дублирующиеся экземпляры объекта Tag для статей пользователя
author.articles.values('tags').distinct()
Я так завидую, что это отличный ответ @since9teen94
.
Имейте в виду, я буду основывать свой ответ не на самом простом решении, а на том, как мы моделируем реальность (или как мы должны это делать).
Мы ставим теги после того, как вещи существуют, верно?
В этом порядке я сделаю вашу жизнь ужасной чем-то вроде этого:
from django.db import models
class Author(models.Model):
name = models.CharField(max_length=30, null=False)
class Article(models.Model):
name = models.CharField(max_length=30, null=False)
author = models.ForeignKey(Author, on_delete=models.CASCADE)
class Tag(models.Model):
name = models.CharField(max_length=30, null=False, unique=True)
articles = models.ManyToManyField(Article)
но поверьте мне, вы не захотите следовать этому подходу, это сделает вашу работу сложнее.
Вы можете искать статьи по тегам напрямую
Tag.objects.filter(name='Scify').first().articles.all() # name is unique
Настоящая проблема в том, что обратный поиск действительно сложен (я имею в виду... приготовьтесь к отладке)
Article.objects.filter(
id__in=list(
Tag.objects.filter(name='Scify').first().articles.values_list('id', flat=True)
)
)
Я уверен, что это не решит вашу проблему, и я не люблю сложный код без причины, но если вы открыты для предложений, я не против подумать по-другому и добавить некоторые опции