【问题标题】:Django inner join to a model without directly relationshipDjango内部连接到没有直接关系的模型
【发布时间】:2022-01-19 08:18:52
【问题描述】:

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

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 获取数据...

我该怎么做?

【问题讨论】:

    标签: django django-models django-rest-framework django-queryset


    【解决方案1】:

    试试这个:

    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 序列化程序使用BazModelbarFooModel 对象中获取数据。

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

    【讨论】:

    • 它对我有用。谢谢!
    猜你喜欢
    • 2011-09-29
    • 1970-01-01
    • 1970-01-01
    • 2017-11-12
    • 2017-04-29
    • 1970-01-01
    • 2017-04-12
    • 1970-01-01
    • 2020-05-21
    相关资源
    最近更新 更多