我有一张名为messages
的表格。在我的应用程序中,用户可以发送不同的类型消息。就像转发事件一样,等等。我在该表中有type
和value
列。
我想要做的是针对特定的type
,转到特定的表并确保value
有效(通常这会映射到该表的id
)。可能有多种类型,每种类型都必须映射到不同的表。有没有办法在内置的django ORM中逻辑地写这个?现在,我只是看到这种可行性,如果我使用直接SQL,如果我可以逃脱它,我宁愿不这样做......
现在我正在做类似的事情:
Messages.objects.all().filter(Q(user_id=id))...etc
我想在上面的语句中添加type
和特定的type
,请检查与之关联的表格。
答案 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 classes和Proxy models。您也可以按照@AndrewGorcester的建议持有GenericForeignKey。