Home > Software design >  Django inner join to a model without directly relationship
Django inner join to a model without directly relationship

Time:01-20

i need to join a table without a direct relationship.

models.py:


class FooModel():
  bar = ForeignKey(Bar)

class BarModel():
  pass

class BazModel():
  bar = ForeignKey(Bar)

class QuxModel():
  foo = ForeignKey(Foo)

tried to reach Foo from Baz but didn't work

viewset.py:

def BazView(viewsets.ModelViewSet):
  queryset = model.BazModel.objects.all().prefetch_related('bar').prefetch_related('baz__bar')
  serializer_class = serializer.Baz

  def get_queryset(self):
    return self.queryset

serializer.py

class FooSerializer(serializer.ModelSerializer):
  class Meta:
    model = FooModel
    exlude = []

class BarSerializer(serializer.ModelSerializer):
  class Meta:
    model = BarModel
    exlude = []

class BazSerializer(serializer.ModelSerializer):
  foo = FooSerializer()

  class Meta:
    model = BarModel
    exlude = []

class QuxSerializer(serializer.ModelSerializer):
  class Meta:
    model = QuxModel
    exlude = []

using prefetch like that i got an error saying that Baz has no foo field.

also would like to get data from QuxModel based on Foo FK...

how could i perform this?

CodePudding user response:

Try this:

model.BazModel.objects.all().select_related('bar').prefetch_related('bar__foomodel_set')

And then in BazSerializer, you can set the source for foo like this:

class BazSerializer(serializer.ModelSerializer):
    foo = FooSerializer(source='bar.foomodel_set')

This will tell the foo serializer to get it's data from the FooModel objects using BazModel's bar.

You might have to change foomodel_set to the related name you have set to access FooModel from BarModel.

  •  Tags:  
  • Related