2012-09-29 55 views
0

它看起来很奇怪,但是当删除文档中的元素并尝试从GridFS中删除_id(删除产品+其图像)时,它给我一个错误,因为图片被删除了si NOT元素的图片!图片的id我做了使用name of the user + time.timeGridFS元素不遵循文档元素

这里使用的是代码:

class VentesHandler(BaseHandler): 
    @tornado.web.authenticated 
    def get(self): 
     user = self.get_secure_cookie("mechtari") 
     info = tornado.escape.json_decode(user) 
     email = info["personnel"]["email"] 
     try: 
      produits = self.db.users.find({"personnel.email":email}, {"produit_up":1,"_id":0}).distinct("produit_up") 
      renderer = self.fs 
      print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up")) 
      print str(self.fs.list()) 
     except (errors.AutoReconnect, errors.ConnectionFailure): 
      print "hopla" 
      self.redirect("/error") 
    try: 
     self.render("ventes.html", produits=produits, renderer=renderer) 
    except gridfs.errors.NoFile, e: 
     self.write(str(e)) 


class Supprimer(BaseHandler): 
    @tornado.web.authenticated 
    def post(self): 
     debut = time.clock() 
     prod = self.get_arguments("supprime") 
     produ = prod[0][:] 
     idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"] 
     print idd 
     try: 
      self.db.users.update({"produit_up.spec.id":produ}, {"$pull":{"produit_up"{"spec.id":produ}}}) 
      self.fs.delete(ObjectId('{0}'.format(idd))) 
      print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up")) 
      print str(self.fs.list()) 
     except (errors.AutoReconnect, errors.ConnectionFailure): 
      self.redirect("/error") 
    print time.clock() - debut 
    self.redirect("/ventes") 

模板:

{% for produit in produits %} 
<div class="produit"> 
<span class="nom">Le nom du produit: {{produit["spec"]["namep"]}}</span> 
{% if produit["spec"]["nombre"] != 0 %} 
<span class="quantite">Le nombre de produits disponible: {{produit["spec"]["nombre"]}} </span> 
     {% else %} 
     <span class="quantite"><em>RUPTURE DE STOCK!</em></span> 
     {% end %} 
     <span class="prix">Son prix: {{produit["spec"]["prix"]}} DA ({{produit["spec"]["prix"]*100}} Centimes)</span> 
     <span class="description">Description: {{produit["spec"]["description"]}}</span> 
     <span class="date">Publi&eacute; le {{produit["spec"]["date"]}}</span> 
     <span class="site"><a href="{{produit["spec"]["id"]}}">Page du Produit</a></span> 
     {% from bson import ObjectId %} 
     {% if produit["avatar"]["orientation"]=="portrait" %} 
     <span><img src="/{{renderer.get(ObjectId(produit["avatar"]["photo"])).filename}}" height="250px" class="imag"> 
     {% else %} 
     <span><img src="/{{renderer.get(ObjectId(produit["avatar"]["photo"])).filename}}" width="250px"class="imag"> 
     {% end %} 
     <div class="supprimer" > 
      <form name="supprimer" class="supprimer" method="post" action="/supprimer"> 
       {% raw xsrf_form_html() %} 
       <input type="hidden" value="{{produit["spec"]["id"]}}" name="supprime"/> 
       <script>function miaw() 
       { 
       return confirm("Voulez-Vous vraiment SUPPRIMER le produit DÉFINITIVEMENT!") 
       } 
       </script>     
       <input type="submit" value="SUPPRIMER!" onclick="return miaw()"/> 
      </form> 
     </div> 
</div>{% end %}{% end %} 

这里是结果,但不删除,所以在第一次执行代码时:

[{u'spec': {u'description': u'vend nokia 3310 du top', u'tags': [u'nokia', u'portable', u'solide'], u'vendu': False, u'prix': 1000, u'abus': 0, u'namep': u'nokia 3310', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859865997'}, u'avatar': {u'photo': ObjectId('5061fb833a5f3a09f4be0e22'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'bajoooooooot', u'tags': [u'206', u'hdi', u'peugeot'], u'vendu': False, u'prix': 500000, u'abus': 0, u'namep': u'peugeot 206', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859875565'}, u'avatar': {u'photo': ObjectId('5061fbe33a5f3a09f4be0e26'), u'avctype': u'image/jpeg', u'orientation': u'paysage'}}] 


[u'134859845728-nopic.jpg', u'134859865997-nokia.jpg', u'134859872247-apple-iphone-3-gs.jpg', u'134859875565-peugeot.jpg'] 

在列表中删除仅第一个元素时(最新的一个补充,这里的诺基亚3310):

THR代码:

print str(self.db.users.find({"personnel.pseudo":"alucaard"}).distinct("produit_up")) 

给出:

[{u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}, {u'spec': {u'description': u'bajoooooooot', u'tags': [u'206', u'hdi', u'peugeot'], u'vendu': False, u'prix': 500000, u'abus': 0, u'namep': u'peugeot 206', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859875565'}, u'avatar': {u'photo':ObjectId('5061fbe33a5f3a09f4be0e26'), u'avctype': u'image/jpeg', u'orientation': u'paysage'}}] 

,代码:

print str(self.fs.list()) 

[u'134859845728-nopic.jpg', u'134859872247-apple-iphone-3-gs.jpg', u'134859875565-peugeot.jpg'] 

但是,当试图删除一个不是第一个产品的产品时,这里有两个产品, NE和标致,让我们删除标致:

[{u'spec': {u'description': u'iphone foooooooort', u'tags': [u'iphone', u'apple', u'3g'], u'vendu': False, u'prix': 20000, u'abus': 0, u'namep': u'iphone 3gs', u'date': u'2012-09-25', u'nombre': 1, u'id': u'alucaard134859872247'}, u'avatar': {u'photo': ObjectId('5061fbc23a5f3a09f4be0e24'), u'avctype': u'image/jpeg', u'orientation': u'portrait'}}] 

[u'134859845728-nopic.jpg', u'134859875565-peugeot.jpg'] 

和错误是:

no file in gridfs collection Collection(Database(Connection('localhost', 27017), u'essog'), u'fs.files') with _id ObjectId('5061fbc23a5f3a09f4be0e24') 

所以你可以看到,似乎它dident删除右边的图片!

回答

0

已解决!

这里是我做的:

list(db.users.find({"produit_up.spec.id":"alucaard134859872247"}).distinct("produit_up.spec")) 

Out[13]: 
[{u'abus': 0, 
u'date': u'2012-09-25', 
u'description': u'vend nokia 3310 du top', 
u'id': u'alucaard134859865997', 
u'namep': u'nokia 3310', 
u'nombre': 1, 
u'prix': 1000, 
u'tags': [u'nokia', u'portable', u'solide'], 
u'vendu': False}, 

{u'abus': 0, 
u'date': u'2012-09-25', 
u'description': u'iphone foooooooort', 
u'id': u'alucaard134859872247', 
u'namep': u'iphone 3gs', 
u'nombre': 1, 
u'prix': 20000, 
u'tags': [u'iphone', u'apple', u'3g'], 
u'vendu': False}, 

{u'abus': 0, 
u'date': u'2012-09-25', 
u'description': u'bajoooooooot', 
u'id': u'alucaard134859875565', 
u'namep': u'peugeot 206', 
u'nombre': 1, 
u'prix': 500000, 
u'tags': [u'206', u'hdi', u'peugeot'], 
u'vendu': False}] 

    list(db.users.find({"produit_up.spec.id":"alucaard134859872247"}).distinct("produit_up.spec.id")) 

Out[14]: [u'alucaard134859865997', u'alucaard134859872247', u'alucaard134859875565'] 

所以解决办法是更换:

idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"] 

通过

idd = self.db.users.find_one({"produit_up.spec.id":produ})["produit_up"][0]["avatar"]["photo"] 

我对不起:d

所以这是为什么我没有得到错误时德第一个元素!