Получение списка значений из записей внуков

Я пытаюсь получить доступ к записям внуков в списке, чтобы избежать дублирования записей. В данном примере тег может быть использован только один раз в статьях для данного автора. Я буду использовать полученный список записей о внуках в моей чистой функции для возврата ошибок валидации.

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

Я уверен, что это не решит вашу проблему, и я не люблю сложный код без причины, но если вы открыты для предложений, я не против подумать по-другому и добавить некоторые опции

Вернуться на верх