0

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

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

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

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

我想添加到上面的语句中,检查type和对于特定的type,检查与之关联的表。

4

2 回答 2

1

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

于 2012-10-19T17:01:24.037 回答
0

您可能只想定义一个多表继承结构。这会得到相同的结果,因为您有多种类型的消息和字段继承,但您根本不必弄乱一个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 还支持另外两种模型继承方式:抽象基类代理模型。您还可以按照@AndrewGorcester 的建议持有GenericForeignKey

于 2012-10-19T18:11:25.360 回答