Cách tiếp cận ngu ngốc nhưng nhanh chóng là lấy trường bạn quan tâm, nối chúng thành một chuỗi dài và lưu chúng làm khóa của thực thể DB_Unique
tham chiếu đến thực thể gốc. Mỗi khi bạn thực hiện DB_Unique.get_or_insert()
, bạn nên xác minh tham chiếu là đúng đối tượng gốc, nếu không, bạn có một bản sao. Điều này có lẽ nên được thực hiện trong một map reduce.
Cái gì như:
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
Có một vài trường hợp cạnh mà có thể leo lên, chẳng hạn như nếu bạn có hai thực thể với b và c bằng ('a_b', '') và (' một ',' b_ ') tương ứng, do đó, nối là' a_b_ 'cho cả hai. do đó, sử dụng ký tự bạn biết không có trong chuỗi của bạn thay vì '_' hoặc có DB_Unique.r
là danh sách tham chiếu và so sánh tất cả các ký tự đó.
đó là một giải pháp khá gọn gàng, chắc chắn +1 – systempuntoout