Создание объектов из одной модели на основе нового объекта в другой модели (Джанго) - PullRequest
0 голосов
/ 21 февраля 2011

Довольно плохо знаком с Django (1.2), но просто тестирую материал.

Моя головная боль - найти способ создания серии объектов SKU при создании объекта Product.

class Product(models.Model):
    name = models.CharField(max_length=255, unique=True)
    style = models.CharField(max_length=50)
    colors = models.ManyToManyField(Color)
    sizes = models.ManyToManyField(Size)

class SKU(models.Model):
    id = models.CharField(max_length=15, unique=True, primary_key=True)
    style = models.ForeignKey(Product)
    color = models.ForeignKey(Color)
    size = models.ForeignKey(Size)
    quantity = models.IntegerField(default=0)

Первоначально я пытался справиться с этим в Product.save, но, увы, без игры в кости.Затем я попробовал эту настройку сигналов:

# models.py
def create_skus(sender, instance, *args, **kwargs):
    if 'created' in kwargs:
        if kwargs['created']:
            for x in instance.colors.select_related():
                for y in instance.sizes.select_related():
                    sku = instance.style
                    sku += instance.x.shortcode
                    sku += instance.y.name
                    s = SKU(id=sku, style=instance, color=x, size=y)
                    s.save()

... # after the Product class
post_save.connect(create_skus, sender=Product)

Некоторые примеры, которые я видел, призывают метод сохранения класса отправителя иметь что-то вроде этого:

def save(self):
    post_save.send(create_skus, self)

... и вот гдеЯ в.Эта настройка не выдает никаких ошибок, но она также не создает упомянутые SKU.

Если я не буду использовать какой-либо из этих сигналов, любые указатели будут оценены.Или, если есть другой способ совершить подобный подвиг, это было бы также замечательно.

Приветствия!

1 Ответ

0 голосов
/ 21 февраля 2011
def create_skus(sender, instance, *args, **kwargs):
        if kwargs['created']:
            for color in instance.colors.select_related():
                for size in instance.sizes.select_related():
                    sku = u'%s%s%s' % (instance.style, color.shortcode, size.name) 
                    s = SKU(id=sku, style=instance, color=color, size=size)
                    s.save()

post_save.connect(create_skus, sender=Product)

Это должно работать? Если нет, попробуйте установить Панель отладки и убедиться, что select_related () возвращает ожидаемые результаты.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...