Django 内部连接到没有直接关系的模型

Django inner join to a model without directly relationship

我需要加入一个没有直接关系的table。

models.py:


class FooModel():
  bar = ForeignKey(Bar)

class BarModel():
  pass

class BazModel():
  bar = ForeignKey(Bar)

class QuxModel():
  foo = ForeignKey(Foo)

试图从 Baz 联系 Foo 但没有成功

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 = []

像这样使用 prefetch 我收到一条错误消息说 Baz 没有 foo 字段。

也想从基于 Foo FK 的 QuxModel 获取数据...

我该如何执行此操作?

试试这个:

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

然后在 BazSerializer 中,您可以像这样为 foo 设置 source

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

这将告诉 foo 序列化程序使用 BazModelbar.

FooModel 对象获取数据

您可能需要将 foomodel_set 更改为您设置的相关名称,以便从 BarModel 访问 FooModel