[Answer]-Django ORM join with another table

1đź‘Ť

âś…

It sounds like you have a “polymorphic association”. There are a couple ways to do analogous things in Django, but I think the one that most closely matches what you described is the contenttypes module, which uses separate columns for the type and for the value as in your application.

0đź‘Ť

You may just want to define a multi-table inheritance structure. This gets you the same result in that you have multiple types of messages and field inheritance, but you don’t have to mess with a type field at all.

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

class Event(Message):
    pass

class Tweet(Message):
    pass

In view post handler:

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

Then, get your objects:

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

If this sort of structure doesn’t work for you, there are two other styles of Model inheritance supported by Django: Abstract base classes and Proxy models. You could also hold a GenericForeignKey as suggested by @AndrewGorcester.

👤dokkaebi

Leave a comment