尝试执行 INNER Join 并在 API 上显示结果

Trying to do an INNER Join and display the result on the API

之前有人问过这个问题,但我不能对我的案例使用任何答案。

我正在尝试具有与此等效的功能,以便在 API 上显示结果。

SELECT denom_name,retail_name,retail_adr 
FROM denomination d INNER JOIN Retailer r 
ON r.id = d.retailer.id

这些是我的模型 (models.py):

class Retailer(models.Model):
    retail_name = models.CharField(max_length=30)
    retail_addr = models.CharField(max_length=300,null=True)
    def __str__(self):
        return self.retail_name

class Denomination(models.Model):
    denom_name = models.CharField(max_length=1000)
    retailer = models.ForeignKey(Retailer, on_delete=models.CASCADE)

我已经在 views.py

上创建了一个视图集
class DenomRetailViewset(viewsets.ModelViewSet):

    queryset = Denomination.objects.select_related('Retailer')
    serializer_class =  DenomRetailSerializer  

但这就是问题所在,至少是其中之一。

我正在通过 serializer.py

创建序列化器
class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model= retailer,denomination
        fields = ('denom_name','retail_name','retail_adr')

但是如您所见,序列化程序不能接受两个模型。此外,我对视图集有疑问,queryset = Denomination.objects.select_related('Retailer')

任何提示都非常受欢迎,因为我开始失去理智。

谢谢。

使用source--DRF doc参数

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):
    <b>retail_name = serializers.CharField(source='retailer.retail_name')
    retail_adr = serializers.CharField(source='retailer.retail_adr')</b>

    class Meta:
        model = Denomination
        fields = ('denom_name', 'retail_name', 'retail_adr')

另外,应该是.select_related(<b>'retailer'</b>)而不是.select_related('Retailer')

在这种情况下您可以使用“深度”:

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model= denomination
        fields = ('denom_name','retail')
        depth = 1

响应将 return 像这样的内部连接:

{
    "id": 1,
    "denom_name ": "...",
    "retail": {
        "id" : 1,
        "retail_name" : "...",
        "retail_addr" : "..."
    }
}