Как получить объекты, связанные через общие отношения Django, и определить их типы? - PullRequest
3 голосов
/ 11 августа 2011

Вот мой models.py:

class Player(models.Model):
    name = models.CharField(max_length=100)
    #...fields...
    comment = models.generic.GenericRelation(Comment)   

class Game(models.Model):
    name = models.CharField(max_length=100)
    #...other fields...
    comment = models.generic.GenericRelation(Comment)  

class Comment(models.Model):
    text = models.TextField()
    content_type = ForeignKey(ContentType)
    object_id = models.PositiveIntegerField()
    content_object = generic.GenericForeignKey()

Чтобы перейти от игрока или игры к комментарию, я могу просто сделать это?

text = PlayerInstance.comment.text

Также, имея комментарий, я не знаю, как узнать, где я в конечном итоге (какая модель)

CommentInstance = get_object_or_404(Comment, pk=coment_id)

А как проверить, на какой content_type, на который указывает CommentInstance (Game или Player), а затем как подключиться к нему?

1 Ответ

3 голосов
/ 23 августа 2011

Документацию по родовым отношениям в Django можно найти здесь https://docs.djangoproject.com/en/dev/ref/contrib/contenttypes/#generic-relations

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

linked_object = CommentInstance.content_object

Если вы хотите узнатьчто это за объект, вы можете задать его, используя type, isinstance или issubclass, как вы можете это сделать с любым объектом в python.Попробуйте это

linked_object_type = type(linked_object)

Так что, если вы хотите делать разные вещи, основываясь на том, что вы игрок или игра, вы можете сделать что-то вроде

if isinstance(linked_object, Player):
    # Do player things
elif isinstance(linked_object, Game):
    # Do game things
else:
    # Remember it might be something else entirely!

Я полагаю, вы надеялись здесьатрибуты CommentInstance, называемые чем-то вроде player или game.Они не существуют - вы даже не знаете из того, что у вас есть выше в вашем models.py, что это определенно будет один из этих двух типов объектов.

PS Возможно, вы захотите изменить порядок вещей в вашемФайл models.py для размещения комментария перед двумя другими.

...