【问题标题】:Trying to do an INNER Join and display the result on the API尝试进行 INNER Join 并在 API 上显示结果
【发布时间】:2020-11-05 05:20:49
【问题描述】:

以前有人问过这个问题,但我无法使用我的案例的任何答案。

我正在尝试使用与此等效的方法,以便在 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')

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

谢谢。

【问题讨论】:

  • 改用get_queryset(..)
  • 如果Retailer 必须存在(如“inner join”所暗示的那样),您需要更改您的queryset,如queryset = Denomination.objects.select_related('Retailer').filter(retailer__isnull=False)

标签: python django django-rest-framework django-rest-viewsets


【解决方案1】:

使用source--DRF doc 参数

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):
    retail_name = serializers.CharField(source='retailer.retail_name')
    retail_adr = serializers.CharField(source='retailer.retail_adr')

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

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

【讨论】:

  • 嗨@arrakal-abu,很好的答案。谢谢你。积分是你的。
【解决方案2】:

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

class DenomRetailSerializer(serializers.HyperlinkedModelSerializer):

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

响应将返回一个像这样的内部连接:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-12-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多