Django Остальное объединение моделей на нескольких полях - PullRequest
0 голосов
/ 28 марта 2020

У меня есть две модели, как показано ниже.

Эти модели хранят бюджетные данные о продажах и фактические данные о продажах для каждого проекта по каждому месяцу.

# To test join on multiple keys

class ActualSales(models.Model):
    time_id = models.CharField(max_length=8)
    project = models.CharField(max_length=100)
    actual_sales = models.DecimalField(max_digits=20, decimal_places=3)
    adjustment = models.DecimalField(max_digits=20, decimal_places=3)


class BudgetSales(models.Model):
    time_id = models.CharField(max_length=8)
    project = models.CharField(max_length=100)
    budget_sales = models.DecimalField(max_digits=20, decimal_places=3)

И данные будут выглядеть примерно так:

Model A

| time_id |  project  | sales | adjustment |
+---------+-----------+-------+------------+
| 2019JAN | Project A |  1000 |         10 |
| 2019JAN | Project B |  2500 |          5 |
| 2019FEB | Project A |  1100 |          0 |
| 2019FEB | Project B |  2400 |        -10 |
+---------+-----------+-------+------------+

Model B

| time_id |  project  | budget |
+---------+-----------+--------+
| 2019JAN | Project A |   1100 |
| 2019JAN | Project B |   2400 |
| 2019FEB | Project A |   1000 |
| 2019FEB | Project B |   2500 |
+---------+-----------+--------+

И я стремлюсь создать массив объектов, каждый из которых представляет результат каждого проекта каждый месяц, аналогично как мы соединяем 2 таблицы с sql. Однако я не уверен, как написать сериализатор и API Viewset для этого.

[
  {
    time_id: "2019JAN",
    project: "Project A",
    sales: "1000",
    adjustment: "10",
    budget: "1100"
  },
  {
    time_id: "2019JAN",
    project: "Project B",
    sales: "2500",
    adjustment: "5",
    budget: "2400"
  },
  {
    time_id: "2019FEB",
    project: "Project A",
    sales: "1100",
    adjustment: "0",
    budget: "1000"
  },
  {
    time_id: "2019FEB",
    project: "Project B",
    sales: "2400",
    adjustment: "-10",
    budget: "2500"
  }
]

1 Ответ

0 голосов
/ 28 марта 2020

Вы можете попробовать это

Models.py

class ActualSales(models.Model):
    time_id = models.CharField(max_length=8)
    project = models.CharField(max_length=100)
    actual_sales = models.DecimalField(max_digits=20, decimal_places=3)
    adjustment = models.DecimalField(max_digits=20, decimal_places=3)

    def get_budget(self):
        bugdesale = BudgetSales.objects.filter(time_id=self.time_id)
        if bugdesale.exists():
            return bugdesale.first().budget_sales
        else:
            return None

Serializers.py

class ActualSalesSerializer(serializers.ModelSerializer):
    class Meta:
        model = ActualSales
        fields = ('time_id','project', 'actual_sales', 'adjustment', 'get_budget')
...