กำลังพยายามเข้าร่วม INNER และแสดงผลลัพธ์บน 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')

แต่อย่างที่คุณเห็น serializer ไม่สามารถยอมรับสองรุ่นได้ แถมมีข้อสงสัยเรื่อง viewset อีกด้วย queryset = Denomination.objects.select_related('Retailer')

เรายินดีรับคำแนะนำต่างๆ มากมายเนื่องจากฉันเริ่มสูญเสียสติไปแล้ว

ขอบคุณ.


person Andy K    schedule 15.07.2020    source แหล่งที่มา
comment
ใช้ get_queryset(..) แทนใช่ไหม   -  person thebjorn    schedule 15.07.2020
comment
หาก Retailer ต้อง มีอยู่ (ตามนัยของ inner join) คุณจะต้องเปลี่ยน queryset ชอบ queryset = Denomination.objects.select_related('Retailer').filter(retailer__isnull=False)   -  person Ross Rogers    schedule 15.07.2020


คำตอบ (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" : "..."
    }
}

person Phuc Nguyen    schedule 16.07.2020