0
votes

Django - accès aux objets associés dans un modèle

Comment puis-je accéder à un objet associé dans un modèle django? Je veux simplement afficher le titre de l'article du signet sur mon modèle. En supposant la vue et le (s) modèle (s) suivant (s):

def my_bookmarks(request):
    if request.method == 'GET':
        list_my_bookmarks = sorted(
            chain(
                UserBookmarks.objects.filter(user=request.user),
            ), key=attrgetter('date_added'), reverse=True
        )
        paginator = Paginator(list_my_bookmarks, 20)  # Show 20 bookmarks per page
        page = request.GET.get('page')
        my_bookmarks = paginator.get_page(page)
        user = request.user
        args = {'user': user,
                'my_bookmarks': my_bookmarks,
                }
        return render(request, 'App/my_bookmarks.html', args)


bookmarkable_post_models = models.Q(app_label='App', model='post') | models.Q(app_label='App', model='model-b') | models.Q(app_label='App', model='model-c')


class UserBookmarks(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE, null=False, blank=False)
    content_type = models.ForeignKey(ContentType, limit_choices_to=bookmarkable_post_models, related_name='bookmarks', related_query_name='bookmark', on_delete=models.CASCADE, null=True, blank=False)
    object_id = models.CharField(max_length=50, blank=False)
    content_object = GenericForeignKey('content_type', 'object_id')
    date_added = models.DateTimeField(auto_now_add=True, blank=False)


class Post(models.Model):
    id = models.UUIDField(primary_key=True, default=uuid.uuid4, editable=False)
    author = models.ForeignKey(User, on_delete=models.CASCADE)
    title = models.CharField(verbose_name="Post Title", max_length=20)
    content = models.TextField(verbose_name="Content of Post")
    ...
    bookmarks = GenericRelation(UserBookmarks, related_query_name='post')

L'accès aux objets du signet lui-même ne semble pas poser de problème si je le fais: {{my_bookmarks}} dans mon modèle mais je ne comprends pas comment accéder à l'élément de publication derrière le signet

Merci d'avoir lu


7 commentaires

bookmark.post ?


Non, cela ne fonctionne pas.


bookmark.content_object ?


Encore une fois, rien qui n'a de sens car j'accède à UserBookmarks et non à publier. Je ne sais pas si "signet" a même un sens à ce stade car je veux obtenir l'objet Post derrière l'objet UserBookmarks ...


Ou est-ce que je dois peut-être faire l'inverse pour accéder à Post.bookmarks sur mon view.py?


content_object devrait fonctionner. Êtes-vous sûr que les colonnes clés génériques contiennent les données correctes?


my_bookmarks.content_object.title fonctionne bien, merci pour vos conseils.


3 Réponses :


0
votes
  • mybookmarks.post est un RelationManager ,
  • mybookmarks.post.all() est un Queryset .
  • Vous pouvez parcourir le modèle:

    {% for post in mybookmarks.post.all %}
        {{ post }}
    {% endfor %}
    ```
    

0 commentaires

0
votes

Avez-vous essayé d'utiliser _set pour obtenir les objets Post associés?

par exemple:

{% for post in my_bookmarks.post_set.all() %}
   {{ post.title }}
{% endfor %}

Cela affichera le titre de chaque Post lié à votre UserBookmark .


0 commentaires

0
votes

Ce qui suit a fonctionné pour moi:

 {% for bookmark in my_bookmarks %}
    <p>{{ bookmark.content_object.title }}</p>

Veuillez également consulter la section des commentaires de ma question.

Merci à tous


0 commentaires