如何概念化Django的ForeignKey?

时间:2014-07-07 12:09:11

标签: django foreign-key-relationship

我阅读了ForeignKey的文档,并说外键给出了多对一的关系。

我举了这个例子说每个ChatRoom可以有多条消息:

class Message(models.Model):
    message=models.CharField(max_length=30)

class ChatRoom(models.Model):
    message=models.ForeignKey(Message)

这段代码能实现吗?如果没有,我想正确答案应该是这个

class ChatRoom(models.Model):
    room_name=models.CharField(max_length=30)

class Message(models.Model):
    message=models.CharField(max_length=30)
    room=models.ForeignKey(ChatRoom)

在任何情况下,我如何在ChatRoom中显示所有消息?

2 个答案:

答案 0 :(得分:2)

这是适合您目的的正确模型声明(第二个):

class ChatRoom(models.Model):
    room_name=models.CharField(max_length=30)

class Message(models.Model):
    message=models.CharField(max_length=30)
    room=models.ForeignKey(ChatRoom)

这意味着有更多的消息(很多)与单个聊天室(一个)相关。

要显示所有消息,请执行以下操作:

messages = chat_room.message_set.values('message')

其中chat_room是ChatRoom模型

的实例

或者,您可以创建相关名称:

class Message(models.Model):
    message=models.CharField(max_length=30)
    room=models.ForeignKey(ChatRoom, related_name='messages')

然后,做

messages = chat_room.messages.values('message')

实际接收所有消息,或

messages = chat_room.messages.all()

获取所有对象(不仅仅是消息)

答案 1 :(得分:1)

class ChatRoom(models.Model):
    room_name=models.CharField(max_length=30)

class Message(models.Model):
    message=models.CharField(max_length=30)
    room=models.ForeignKey(ChatRoom)

用于显示聊天室的所有消息:

chatroomobject.message_set.all() in backend views/scripts
chatroomobject.message_set.all in templates

这里:

chatroomobject is the instance object of the ChatRoom Model