Как получить django поле многие ко многим со списком подписанных объектов - PullRequest
0 голосов
/ 15 марта 2019

пользователи в моем проекте могут подписаться на модель Board, и я пытаюсь показать все объекты из всех подписанных плат, на которые подписан пользователь.

Но не знаю как.Я ищу в Интернете, но ничто не помогает мне в этом.

Модельная доска:

class Board(models.Model):
    title = models.CharField(max_length=255, verbose_name='Tytuł')
    slug = AutoSlugField(populate_from='title', unique=True)
    image = ImageField(blank=True, manual_crop="" ,verbose_name='Tło')
    body = models.TextField(verbose_name='Opis kategorii')
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    subscribers = models.ManyToManyField(User, related_name='subscribed_boards', blank=True)
    created_at = models.DateTimeField(auto_now_add=True)

Модели, связанные с (я пытаюсь показать эти объекты на подписанных досках):

class Subject(models.Model):
    title = models.CharField(max_length=255, verbose_name='Tytuł')
    slug = AutoSlugField(populate_from='title', unique=True)
    body = HTMLField(blank=True, verbose_name='Treść')
    image = models.ImageField(upload_to='subject', null=True, blank=True)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    active = models.BooleanField(default=True)
    created_at = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, on_delete=models.CASCADE, related_name='subjects', verbose_name='Kategoria')
    votes = GenericRelation(LikeDislike, related_query_name='subjectsvotes')

class Embed(models.Model):
    url = models.URLField(max_length=255)
    title = models.CharField(max_length=255, verbose_name='Tytuł')
    description = HTMLField(verbose_name='Opis')
    thumbnail_url = models.URLField(max_length=255)
    html = models.TextField()
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    created_at = models.DateTimeField(auto_now_add=True)
    board = models.ForeignKey(Board, on_delete=models.CASCADE, blank=True, null=True, related_name='embeds', verbose_name='Kategoria')
    votes = GenericRelation(LikeDislike, related_query_name='embedvotes')
    slug = AutoSlugField(populate_from='title', unique=True)

В поле зрения я пытаюсь это:

def feed(request):
    user = get_object_or_404(User, username=request.user)
    feed = user.subscribed_boards.all()
    embeds = feed.filter(embed__in=feed)
    return render(request, 'boards/feed.html',
                {'feed': feed,
                'embeds': embeds})

Ответы [ 2 ]

2 голосов
/ 15 марта 2019

В вашем текущем коде есть циклическая ссылка от feed до feed. Фактически требуемый код намного проще:

boards = user.subscribed_boards.prefetch_related('embeds')

Теперь вы можете перебирать доски и вставки в доски:

for board in boards:
    print(board.title)
    for embed in board.embeds.all():
        print(embed.title)

Выше приведен код Python, показывающий, как получить доступ к объектам; Скорее всего, вы захотите сделать циклы в шаблоне.

0 голосов
/ 15 марта 2019

Вы можете попробовать следующий код:

def feed(request):
    user = get_object_or_404(User, username=request.user)
    feed = user.subscribed_boards.all()
    embeds = user.subscribed_boards.filter(embed__in=feed)
    return render(request, 'boards/feed.html',
                {'feed': feed,
                'embeds': embeds})

Пожалуйста, проверьте, работает ли оно.

...