Django加入非托管表

时间:2019-11-21 21:56:46

标签: django python-3.x django-models django-rest-framework django-queryset

我有四个模型,每个模型都包含自己的数据。这些模型是:

  • 类别(包含department_id外键)
  • 部门(包含数据,没有外键)
  • ProductCategory(仅包含product_id和category_id的联接表)
  • 产品(不包含外键的数据)
# models.py (excluded the rest for brevity)

from django.db import models

class Department(models.Model):
    department_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'department'


class Category(models.Model):
    category_id = models.AutoField(primary_key=True)
    #department_id = models.IntegerField()
    department = models.ForeignKey(Department, on_delete=models.CASCADE)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000, blank=True, null=True)

    class Meta:
        managed = False
        db_table = 'category'

class Product(models.Model):
    product_id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    description = models.CharField(max_length=1000)
    price = models.DecimalField(max_digits=10, decimal_places=2)
    discounted_price = models.DecimalField(max_digits=10, decimal_places=2)
    image = models.CharField(max_length=150, blank=True, null=True)
    image_2 = models.CharField(max_length=150, blank=True, null=True)
    thumbnail = models.CharField(max_length=150, blank=True, null=True)
    display = models.SmallIntegerField()

    class Meta:
        managed = False
        db_table = 'product'

class ProductCategory(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    category = models.ForeignKey(Category, on_delete=models.CASCADE)

    class Meta:
        managed = False
        db_table = 'product_category'
        unique_together = (('product', 'category'),)

从端点开始,我需要将所有产品归入部门,并以以下格式返回响应:

​"rows"​: [
    {
​      "product_id"​: ​integer​,
      "name"​: ​string​,
      ​"description"​: ​string​,
      "price"​: ​string​,
      ​"discounted_price"​: ​string​,
      "thumbnail"​: ​string​
    }
]

这是端点:

path('products/inDepartment/<int:department_id>/', ProductViewSet.as_view({"get": "get_products_by_department"}))

我该怎么做?我被下面的代码困住了:

# products.py

def get_products_by_department(self, request, department_id):
        """
        Get a list of Products of Departments
        """
        categories = Category.objects.filter(department_id=department_id).values('category_id')

        for item in categories:
          category_id = item['category_id']
          products = ProductCategory.objects.filter(category_id=category_id).values(
            'product_id', name=F('product__name'), description=F('product__description'),
          price=F('product__price'), discounted_price=F('product__discounted_price'), thumbnail=F('product__thumbnail'))

        # Return response
        if products.exists():
          return Response(products, 200)
        else:
          return Response(products, 204)

上面的代码可以正常工作,并且给我正确的响应,但是我不确定我是否正确地执行了查询?我应该使用循环还是没有循环的Django更好的方法?

1 个答案:

答案 0 :(得分:0)

Django的ORM允许反向关系查找。 https://docs.djangoproject.com/en/2.2/topics/db/queries/#lookups-that-span-relationships

categories = Category.objects.filter(department_id=department_id)    
products = Product.objects.filter(productcategory__category__in=categories)