Django ORM加入另一个表

时间:2012-10-19 16:55:29

标签: django orm

我有一张名为messages的表格。在我的应用程序中,用户可以发送不同的类型消息。就像转发事件一样,等等。我在该表中有typevalue列。

我想要做的是针对特定的type,转到特定的表并确保value有效(通常这会映射到该表的id)。可能有多种类型,每种类型都必须映射到不同的表。有没有办法在内置的django ORM中逻辑地写这个?现在,我只是看到这种可行性,如果我使用直接SQL,如果我可以逃脱它,我宁愿不这样做......

现在我正在做类似的事情:

Messages.objects.all().filter(Q(user_id=id))...etc

我想在上面的语句中添加type和特定的type,请检查与之关联的表格。

2 个答案:

答案 0 :(得分:1)

听起来你有一个“多态关联”。在Django中有几种方法可以做类似的事情,但我认为与你所描述的最匹配的是contenttypes模块,它在类型和值中使用单独的列,就像你的应用程序一样。 / p>

答案 1 :(得分:0)

您可能只想定义multi-table inheritance结构。这会得到相同的结果,因为您有多种类型的消息和字段继承,但您根本不必弄乱type字段。

class Message(models.Model):
    value = models.CharField(max_length=9000)

class Event(Message):
    pass

class Tweet(Message):
    pass

在视图帖子处理程序中:

...
if request.POST['type'] == 'event':
    Event.objects.create(value=request.POST['value'])
elif request.POST['type'] == 'tweet':
    Tweet.objects.create(value=request.POST['value'])
...

然后,获取您的对象:

all_tweets = Tweet.objects.all()
all_messages = Message.objects.all()

for message in all_messages:
    try:
        event = message.event
    except Event.DoesNotExist:
        # this message is not an Event
        pass

如果这种结构不适合你,Django支持另外两种模型继承样式:Abstract base classesProxy models。您也可以按照@AndrewGorcester的建议持有GenericForeignKey