python 如何在Django上使用ORM加入

aelbi1ox  于 2023-05-27  发布在  Python
关注(0)|答案(3)|浏览(124)

大家好,我在这里束手无策,我需要帮助做一个简单的连接之间的2表使用Django ORM。
最终目标是返回一个与datatable兼容的json响应,其中包含产品详细信息和产品类别名称,而不是类别id。

就像这样

{
    "draw": 1,
    "recordsTotal": 1,
    "recordsFiltered": 1,
    "data": [
        {
            "productid": 4,
            "sku": "000001",
            "shortcode": "CBG",
            "category": 2,
            "categoryname": "Burgers",
            "productname": "Cheese Burger",
            "description": "This is a cheese burger",
            "barcode": "000001",
            "treshhold": 10,
            "isactive": true
        }
    ]
}

这是我的模特

class ProductCategory(models.Model):
    categoryid = models.AutoField(primary_key=True)
    shortcode = models.CharField(max_length=10)
    categoryname = models.CharField(max_length=50,unique=True)
    isactive= models.BooleanField(default=True)

    class Meta:
        db_table="tblProductCategory"
        

class Product(models.Model):
    productid = models.AutoField(primary_key=True)
    sku = models.CharField(max_length=20,unique=True)
    shortcode = models.CharField(max_length=10)
    category = models.ForeignKey(ProductCategory, on_delete=models.SET_DEFAULT,default=0)
    productname = models.CharField(max_length=50)
    description = models.CharField(max_length=50)
    barcode = models.CharField(max_length=20)
    treshhold = models.IntegerField()
    isactive= models.BooleanField(default=True)
    
    class Meta:
        db_table="tblProduct"

我的观点

def get_product(request):
    recordsTotal = 0
    draw = int(request.GET['draw'])
    start = int(request.GET['start'])
    length = int(request.GET['length'])

    products = Product.objects.filter(sku__icontains = request.GET['sku']).select_related('category')
    
    recordsTotal = products.count()
    recordsFiltered = recordsTotal

    page =  start / length + 1

    paginator = Paginator(products, length)

    try:
        object_list = paginator.page(page).object_list
    except PageNotAnInteger:
        object_list = paginator.page(draw).object_list
    except EmptyPage:
        object_list = paginator.page(paginator.num_pages).object_list

    data = [model_to_dict(product) for product in object_list]

    json_res={
        "draw": draw,
        "recordsTotal": recordsTotal,
        "recordsFiltered": recordsFiltered,
        'data':data,
    }

    return JsonResponse(json_res);

我的序列化器

class ProductSerializer(serializers.ModelSerializer):
        class Meta:
            model =Product
            fields = '__all__'

使用序列化器似乎是正确的方法。但我真的不明白它们是如何工作的,也不知道如何实施。

bvuwiixz

bvuwiixz1#

您应该能够访问products[index].category.categoryname处的类别名称。

gkn4icbw

gkn4icbw2#

你可以尝试:

class ProductSerializer(serializers.ModelSerializer):
    category = serializers.CharField(source="category.categoryname")

    class Meta:
        model = Product
        fields = [
            'productid',
            'sku',
            'shortcode',
            'category',
            'productname',
            'description',
            'barcode',
            'treshhold',
            'isactive'
       ]

鉴于此:

try:
    object_list = paginator.page(page).object_list
except PageNotAnInteger:
    object_list = paginator.page(draw).object_list
except EmptyPage:
    object_list = paginator.page(paginator.num_pages).object_list
serializer = ProductSerializer(object_list, many=True)
return Response(serializer.data)
pxy2qtax

pxy2qtax3#

如果您没有获取类别表的数据,即Ctaegory name你可以试着一个接一个地取
例如:

products = Product.objects.filter(sku__icontains=request.GET['sku']).values(
    'productid', 'sku', 'shortcode', 'category_id', 'category__categoryname',
    'productname', 'description', 'barcode', 'treshhold', 'isactive'
)

相关问题