пикап "уникальный элемент" поля в модели Django с использованием Python - PullRequest
1 голос
/ 21 декабря 2011

Сейчас я учусь использовать django и python, и у меня есть небольшое задание, как показано ниже:

Я регулярно веду учет своих ежемесячных инвестиционных данных и создаю модель django, как показано ниже:

class money_tx(models.Model):
    tx_date = models.DateField()
    investment_plan = models.ForeignKey(investment_plan)
    tx_type_choice = (
        ("deposit","deposit"),
        ("withdrawal","withdrawal"),
    )
    tx_type = models.CharField(max_length=20, choices=tx_type_choice)
    tx_amt = models.DecimalField(max_digits=16,decimal_places=6)

    class Meta:
        ordering = ["-tx_date"]

Я пытаюсь создать представление в django, которое сообщит мне, какая информация о покупке фонда за определенный месяц еще не введена, вывод должен выглядеть примерно так:

DATE    PLAN_A  PLAN_B  PLAN_C
2010-01 PRESENT MISSING PRESENT
2010-02 PRESENT MISSING PRESENT
2010-03 PRESENT MISSING MISSING

Будучи обычным пользователем R, я думаю о вышеприведенном выводе как о dataframe, поэтому мне нужно создать набор данных, подобный приведенному ниже, прежде чем я смогу получить свой вывод:

INV_PLAN  DATE    STATUS
PLAN_A    2010-01 PRESENT
PLAN_A    2010-02 PRESENT
PLAN_A    2010-03 PRESENT
PLAN_B    2010-01 MISSING
PLAN_B    2010-02 MISSING
PLAN_B    2010-03 MISSING
PLAN_C    2010-01 PRESENT
PLAN_C    2010-02 PRESENT
PLAN_C    2010-03 MISSING

Я планирую создать объект словаря (что-то вроде temp = {'test':[1,2,3],'temp':['a','b','c']}) и использовать for loop для создания статуса.

Я без проблем создаю поле date в объекте словаря, но как мне извлечь уникальный PLAN_NAME из моей модели?

Я не знаю, в порядке ли мой способ «мышления с точки зрения R», когда я пытаюсь написать скрипт на Python. Пожалуйста, прокомментируйте, или я должен сделать это, используя MySQL? И извините за анти-пифоническое именование моих объектов. Спасибо.

Обновление 01

Спасибо за ответ DrTyrsa, это почти нормально, вот дополнительная информация:

class investment_organization(models.Model):
    organization_abbre = models.CharField(max_length=20)    
    organization_name = models.CharField(max_length=200)

    def __unicode__(self):
            return self.organization_abbre

class investment_plan(models.Model):
    organization = models.ForeignKey(investment_organization)
    plan_code = models.CharField(max_length=20)

    class Meta:
        ordering = ["organization", "plan_code"]

    def __unicode__(self):
            return u'%s - %s' % (self.organization, self.plan_code)

Мой инвестиционный план состоит из двух частей информации, одна из которых - название компании, которое хранится в другой модели, как я могу включить его в свой конечный результат, как показано ниже:

ORG    INV_PLAN  DATE    STATUS
ORG_A  PLAN_A    2010-01 PRESENT
ORG_A  PLAN_A    2010-02 PRESENT
ORG_A  PLAN_A    2010-03 PRESENT
ORG_A  PLAN_B    2010-01 MISSING
ORG_A  PLAN_B    2010-02 MISSING
ORG_A  PLAN_B    2010-03 MISSING
ORG_B  PLAN_C    2010-01 PRESENT
ORG_B  PLAN_C    2010-02 PRESENT
ORG_B  PLAN_C    2010-03 MISSING

Еще раз спасибо.

1 Ответ

2 голосов
/ 21 декабря 2011

Вот ваш набор данных:

from itertools import groupby

money = money_tx.objects.order_by('-tx_date')
plans = investment_plan.objects.select_related()
result = []

for date, group in groupby(money, lambda x: x.tx_date):
    plans_for_date = set(x.investment_plan_id for x in group)
    for plan in plans:
        data = {'ORG': plan.organization.organization_name,
                'INV_PLAN': plan.plan_code,
                'DATE': date,
                'PRESENT': (plan.id in plans_for_date)}
        result.append(data)

print result
...