def get_or_create(cls, **kwargs):
defaults = kwargs.pop('defaults', {})
query = cls.select()
for field, value in kwargs.items():
if '__' in field:
query = query.filter(**{field: value})
else:
query = query.where(getattr(cls, field) == value)
try:
result = (yield query.get()), False
except cls.DoesNotExist:
try:
params = dict((k, v) for k, v in kwargs.items()
if '__' not in k)
params.update(defaults)
result = (yield cls.create(**params)), True
except IntegrityError as exc:
try:
result = (yield query.get()), False
except cls.DoesNotExist:
raise exc
raise gen.Return(result)
评论列表
文章目录