2010-11-30 4 views
0

J'ai un modèle qui pings un service REST et enregistre les résultats.Existe-t-il une meilleure façon de créer ce modèle? (Django)

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) 

Je dois exécuter chaque à plusieurs reprises et chiffre que je peux .save() dans une vue, puisque l'objet « Store » est dans la majorité de mon point de vue.

Y a-t-il une meilleure façon de procéder? Je devais régler le pk manuellement parce que je recevais des erreurs en double lorsque j'ai essayé d'enregistrer une seconde fois.

Semble un peu sale, et j'essaie d'améliorer mon codage. Merci

+0

Y at-il une raison pour laquelle ce modèle ne peut pas être fusionné avec votre modèle 'Store'? – SingleNegationElimination

Répondre

1

Cela semble plutôt mauvais. D'abord, associer la récupération de l'information d'état à la sauvegarde de l'objet est une mauvaise idée. Si 'mise à jour' est la seule action que vous effectuerez sur ce modèle, alors une meilleure idée serait d'écrire une méthode "update()" qui sauvegarde automatiquement une fois le statut mis à jour, au lieu de le faire dans l'autre sens autour. Deuxièmement: comment créez-vous la première instance de ce modèle? Vous obtiendrez des erreurs de duplication si vous essayez d'enregistrer une nouvelle instance chaque fois que le modèle est mis à jour. Dites, si vous faites quelque chose comme ceci:

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

Ce que vous devez faire est quelque chose comme:

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

Ou:

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

Dans le cas où vous êtes assez paresseux, vous pouvez ajoutez toujours une méthode "update_status" à votre modèle Store et effectuez la création/mise à jour. Il est toujours préférable d'être explicite sur ce que vous faites. Rappelez-vous: Django est basé sur le principe de la moindre surprise, et votre code devrait le devenir! :)

1

Si je vous, j'aurais créé une fonction qui: 1. Acceptez
l'objet de magasin comme paramètre,
2. Faire l'appel REST et
3. Sur réception de la réponse puis mettez à jour l'état dans StoreStatus.

Ceci serait souhaitable pour permettre un couplage lâche qui est requis pour les architectures impliquant des services basés sur le Web. En outre, si vous souhaitez simplement éviter les erreurs PK en double, vous pouvez vérifier si l'ID boucle en toute sécurité la mise à jour et créer des conditions.

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) 
Questions connexes