create_or_get() uses AND instead of OR
Looks like the 'get' part in 'create_or_get' uses 'AND' because at that point you would be trying to get a specific record, not a record that looks like the supplied parameters.

http://docs.peewee-orm.com/en/latest/peewee/querying.html#create-or-get

The same is true for 'get_or_create', you want that specific record, not something that looks like it, and if it couldn't be found, create it.

That said, imagine if it used 'OR' instead and I was, for example, looking for a certain resident belonging to a certain address.

Resident.get((Resident.address == '123 Fake Street') | (Resident.name == 'John')) These methods use `and` because the Django APIs they are intended to mirror use that behavior. This isn't mongo.
Currently, instead of
```
next_with_id, new = ProductCategory.create_or_get(**as_dict(next))
next.id = next_with_id.id
next = next.parent if new else None
```      
I am doing
```
try:
    with db.atomic():
        next.save()
    next = next.parent
except IntegrityError:
    next = ProductCategory.get(
        (ProductCategory.id == next.id) |  # primary key
        (ProductCategory.name == next.name) |  # unique field 1
        (ProductCategory.cat_id == next.cat_id)  # unique field 2
    )
    next = None
```
since the first variant produces
> product.ProductCategoryDoesNotExist: Instance matching query does not exist:
> SQL: SELECT "t1"."id", "t1"."name", "t1"."cat_id", "t1"."n_products", "t1"."n_pages", "t1"."parent_id" FROM "product_category" AS t1 WHERE ((("t1"."name" = %s) AND ("t1"."cat_id" = %s)) AND ("t1"."id" IS %s))
> PARAMS: [u'Appliances', u'4044_90548', None]

Is there a particular reason why create_and_get() uses AND operator instead of OR operator?
Because it could have been much easier to get documents by their unique fields yet without knowing their actual id values.