фильтр объектов модели django из 2 разных моделей

#django #django-models #django-queryset

Вопрос:

Поэтому я пытаюсь отфильтровать комментарии, сделанные конкретным пользователем на определенной станции.

Сначала у меня есть модель с именем комментарий, и она имеет отношение к сообщению.

 class Comment(Votable):
    post = models.ForeignKey(Post, related_name='comments', on_delete=models.CASCADE)
    author = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='comments_authored', on_delete=models.CASCADE, blank=True)
    text = RichTextUploadingField(blank=True, null=True)
    parent = models.ForeignKey('self', related_name='children', null=True, blank=True, on_delete=models.PROTECT)
 

Довольно легко фильтровать только по автору.

А потом у меня есть модель для поста:

 class Post(Votable):
    title = models.CharField(max_length=200, unique=False)
    submitter = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='posts_submitted', on_delete=models.CASCADE)
    url = models.URLField('URL', max_length=200, null=True, blank=True)
    text = RichTextUploadingField(blank=True, null=True)

    def children(self):
        return self.comments.filter(parent=None)
    def __str__(self):
        return self.title

    def save(self, *args, **kwargs): # new
        if not self.post_slug:
            self.post_slug = slugify(str(self.title) str(self.pk))
        return super().save(*args, **kwargs)
 

Модель post имеет связь со станцией, которую я использую StationPost для установления связи. Таким образом, на станции может быть много постов:

 class StationPost(BaseModel):
    station = models.ForeignKey('Station', related_name='posts_set', on_delete=models.CASCADE)
    post = models.ForeignKey('Post', related_name='station', on_delete=models.CASCADE)
    class Meta: unique_together = ['station', 'post']
 

И в случае какой-либо путаницы, вот модель станции

 class Station(BaseModel): #this is to add the station for each posts:
    alphanumeric = RegexValidator(r'^[0-9a-zA-Z]*

Теперь я хочу отфильтровать объекты комментариев, такие как автор-пользователь, а сообщение принадлежит определенной станции.


Ответ №1:

Вы можете просмотреть связь из комментария -> сообщение ->> сообщение станции ->>> станция, как это:

 Comment.objects.filter(
    author=request.user,
    post__station__station=1, # or a station object
).distinct()
 

, 'Only alphanumeric characters are allowed.')
station_name=models.CharField(max_length=19,validators=[alphanumeric], unique=True)
creator = models.ForeignKey(settings.AUTH_USER_MODEL, related_name='station_creator', on_delete=models.CASCADE)
text = models.TextField(max_length=200, default='brief sentence to introduce your space')
posts = models.ManyToManyField('Post', related_name='stations', blank=True, through='StationPost')

def __str__(self):
return self.station_name

def save(self, *args, **kwargs): # new
if not self.slug:
self.slug = slugify(self.station_name)
return super().save(*args, **kwargs)

class Meta:
ordering = [('station_name'), ]
Теперь я хочу отфильтровать объекты комментариев, такие как автор-пользователь, а сообщение принадлежит определенной станции.

Ответ №1:

Вы можете просмотреть связь из комментария -> сообщение ->> сообщение станции ->>> станция, как это: