Есть ли лучший способ создать эту модель?(Джанго) - PullRequest
0 голосов
/ 30 ноября 2010

У меня есть модель, которая пингует службу REST и сохраняет результаты.

class StoreStatus(models.Model):
    store = models.OneToOneField(Store)
    status = models.TextField()

    def save(self, *args, **kwargs):
        self.status = get_store_information(self.store.code)
        self.pk = self.store.pk     
        super( StoreStatus, self ).save(*args, **kwargs)

Мне нужно запускать его несколько раз и подумать, что я могу просто .save () сделать его в виде, поскольку объект "Store" находится в большинстве моих представлений.

Есть лучший способ сделать это?Мне пришлось установить ПК вручную, потому что я получал повторяющиеся ошибки при попытке сохранить во второй раз.

Кажется грязным, и я пытаюсь улучшить свое кодирование.Спасибо

Ответы [ 2 ]

1 голос
/ 03 декабря 2010

На вашем месте я бы создал функцию, которая бы:
1. Примите объект Store в качестве параметра,
2. Сделайте вызов REST и
3. Получив ответ, обновите статус в StoreStatus.

Это было бы желательно для обеспечения слабой связи, которая требуется для архитектур, использующих веб-сервисы.

Более того, если вы просто хотите избежать повторяющихся ошибок PK, вы можете проверить идентификатор, чтобы безопасно зациклить обновление и создать условия.

def save(self, *args, **kwargs):
    if self.id:
        # Update case
        pass
    else:
        # New object
        # Process for the new object
        pass

    # Save the changes
    super(StoreStatus, self).save(*args, **kwargs)
1 голос
/ 30 ноября 2010

Это выглядит довольно плохо.

Во-первых, связать получение информации о состоянии с сохранением объекта - довольно плохая идея.Если «обновление» - единственное действие, которое вы когда-либо выполняете на этой модели, то, возможно, лучше было бы написать метод «update ()», который автоматически сохраняет значение после обновления состояния, а не делать это другим способом.вокруг.

def update(self):
    self.status = get_store_information(self.store.code)
    self.save()

Второе: как вы создаете первый экземпляр этой модели?Вы получите ошибки дублирования, если будете пытаться сохранить новый экземпляр каждый раз, когда обновляется модель.Скажем, если вы делаете что-то вроде этого:

# this will crap out
update = Update(mystore)
update.save()

То, что вы должны делать, это что-то вроде:

# this will work (provided we have 'update')
mystore.status.update()

Или:

# always retrieve the stored instance before saving    
status, created = StoreStatus.objects.get_or_create(store=mystore)
status.update()

В случае, если выдостаточно ленивы, вы всегда можете добавить метод "update_status" к вашей модели Store и выполнить создание / обновление там.Всегда лучше четко указывать, что вы делаете.Помните: Django основан на принципе наименьшего удивления, как и ваш код!:)

...