Как сделать запрос, чтобы получить только данные от каждого пользователя - PullRequest
0 голосов
/ 21 декабря 2018

У меня есть запрос с использованием 3 таблиц.law, article и marked.У меня есть веб-сайт, где пользователь может выбрать один law, чтобы прочитать все articles.Для каждой статьи пользователь может пометить ее или ввести описание этой статьи.

marker и description сохраняются в таблице marked.Поэтому, когда пользователь снова открывает свой закон, все его пометки и описания будут загружены.

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

Пример содержимого помеченной таблицы:

 id is_marked  description  article_id  law_id user_id
"0"   "0"       "test1"     "1100"       "3"    "1"
"1"   "0"       "test2"     "1102"       "3"    "1"

Если я получаю доступ к law = 3 с user_id =2, всеописание user_id = 1 показывает.

Мой запрос:

 law = get_object_or_404(Law, pk=pk)    
    articles = Article.objects.filter(law=pk)    
    articles = (
    Article
    .objects
    .filter(law=pk)
    .annotate(
        is_marked=Exists(
            Marked
            .objects
            .filter(
                article_id=OuterRef('id'),
                usuario=request.user,
                is_marked=1,
            )
           )
        )
    .annotate(
        description=(F('markedLaw__description'))        
    ).order_by('id')

Моя модель:

class Law(models.Model):
    name  = models.CharField('Nome', max_length=100)
    description = models.TextField('Description', blank = True, null=True)


class Article(models.Model):
    article = models.TextField('Article')
    id_article_law = models.IntegerField('Article Law', blank=True, null=True)

    law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='Articles')


class Marked(models.Model):
    law = models.ForeignKey(Law, on_delete=models.CASCADE, verbose_name='Law', related_name='markedArtigos')
    Article = models.ForeignKey(Article, on_delete=models.CASCADE, verbose_name='Article', related_name='markedLaw')
    usuario = models.ForeignKey(settings.AUTH_USER_MODEL, on_delete=models.CASCADE, verbose_name='markedUsuario', related_name='markedUsuario')
    is_marked = models.BooleanField('Está Marcado?', blank=True, default=False)
    description = models.TextField('Descrição', blank = True, null=True)

1 Ответ

0 голосов
/ 21 декабря 2018

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

В этом случае вы будете иметь дело с ним на уровне шаблона, не нужно делатьаннотации.

Вот ссылка: https://docs.djangoproject.com/en/2.1/howto/custom-template-tags/

...