возможно ли привлекать связанных пользователей только через связь с внешним ключом, один раз в django

#python #django #django-models #django-users

#python #django #django-models #django-users

Вопрос:

Привет, я довольно новичок в удивительном мире django!

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

Я думаю, что у меня возникнет масса вопросов об этом проекте, поскольку он оказался действительно крутой кривой обучения, поэтому я подумал, что сначала попробую все это сам, а затем побегу сюда за помощью, когда я застряну!

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

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

Модель

 class Blog(models.Model):

     user = models.ForeignKey(User, help_text = "The User posting this blog entry")
     news = models.ForeignKey(News, unique = True, blank = True, null = True, help_text = "Is this Blog entry related to a news posts IE and Expert Analysis")
     title = models.CharField(max_length = 120, help_text = "The Title of this blog entry")
     slug = models.SlugField(max_length = 150, help_text = "This Field is auto-populated by the title field, its simply used for the CMS urls")
     info = models.TextField()
     categories = models.ManyToManyField(Categories)
     sectors = models.ManyToManyField(Sectors)
     tags = models.ManyToManyField(Tags)
     published = models.DateTimeField()
     status = models.CharField(max_length=1, choices=STATUS_CHOICES, default = 'd')

     class Meta:
         verbose_name_plural = "Blog entries"
         verbose_name = "Blog"
         ordering = ['-published']

     def __unicode__ (self):
         return self.title
  

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

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

Заранее спасибо за любую помощь!!

Ответ №1:

Вы можете выполнить один запрос для пользователей, у которых есть хотя бы одна запись в блоге:

 User.objects.exclude(blog=None)
  

Комментарии:

1. Большое спасибо за ваш быстрый ответ, это сработало на славу! Немного смущенный, я этого не понял! Еще раз спасибо!

Ответ №2:

Я не уверен, как работает решение Daniel’s, поскольку в пользовательской модели нет поля blog, связанного с вашей моделью Blog (о котором я знаю). Но если это сработает, это здорово.

Если вы обнаружите, что у вас все еще возникают проблемы с этим, то, возможно, это поможет. У меня есть два варианта. Во-первых, если все, что вам нужно, это идентификаторы и имена, тогда это может сработать.

 users = Blog.objects.all().order_by('user__username').values('user__id', 
        'user__username').distinct()
  

Во-вторых, если вам нужны реальные пользовательские объекты, то это может быть то, что вам нужно.

 userids = Blog.objects.all().values_list('user__id', flat=True)
users = User.objects.filter(pk__in=userids).order_by('username')
  

Комментарии:

1. Эй, спасибо за ваш ответ, это было похоже на то, что я пытался, поэтому здорово знать, где я ошибался.