Un enfoque estúpido pero rápido sería tomar los campos que te interesan, concatenarlos como una cadena larga y almacenarlos como la clave de una entidad DB_Unique
que hace referencia a la entidad original. Cada vez que haga DB_Unique.get_or_insert()
, debe verificar que la referencia es a la entidad original correcta; de lo contrario, tiene un duplicado. Esto probablemente debería hacerse en un map reduce.
Algo así como:
class DB_Unique(db.Model):
r = db.ReferenceProperty()
class DB_Obj(db.Model):
a = db.IntegerProperty()
b = db.StringProperty()
c = db.StringProperty()
# executed for each DB_Obj...
def mapreduce(entity):
key = '%s_%s_%s' % (entity.a,entity.b,entity.c)
res = DB_Unique.get_or_insert(key, r=entity)
if DB_Unique.r.get_value_for_datastore(res) != entity.key():
# we have a possible collision, verify and delete?
# out two entities are res and entity
Hay un par de casos extremos que pueden arrastrarse para arriba, como si tiene dos entidades con byc igual a ('A_B', '') y (' a ',' b_ ') respectivamente, por lo que la concatenación es' a_b_ 'para ambos. por lo tanto, utilice un carácter que sepa que no está en sus cadenas en lugar de '_', o haga que DB_Unique.r
sea una lista de referencias y compárelas todas.
esa es una solución bastante buena, definitivamente +1 – systempuntoout