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
序列化程序使用 BazModel
的 bar
.
从 FooModel
对象获取数据
您可能需要将 foomodel_set
更改为您设置的相关名称,以便从 BarModel
访问 FooModel
。
我需要加入一个没有直接关系的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
序列化程序使用 BazModel
的 bar
.
FooModel
对象获取数据
您可能需要将 foomodel_set
更改为您设置的相关名称,以便从 BarModel
访问 FooModel
。