2016-02-03 5 views
2

У меня есть модель, как это:Peewee: create_or_get() ошибка в модели с CompositeKey

class ProductOrderItem(BaseModel): 
     prodorder = peewee.ForeignKeyField(modprodord.ProductOrder, related_name='items') 
     cid = peewee.IntegerField(null=False) 
    class Meta: 
     db_table = 'TBWOHPARGDET' 
     primary_key = CompositeKey('prodorder','cid') 

Цель на это, чтобы построить таблицу с чем-то вроде этого:

|ID_ORDER|ID_ORDERLINE| 
    |  1|   1| 
    |  1|   2| 
    |  1|   3| 
    |  2|   1| 

Appart, в моем слое BO, я хочу определить, был ли этот объект ранее создан или нет. Поэтому я использовал create_or_get(method) просто получить создал переменной или lineOrder, который соответствует PK полях -I среднее значение, объект, который был найден в БД с помощью: ме-

for idx,x in enumerate(collection): 
     lineOrder, created = ProductOrderItem.create_or_get(order=orderObj,orderline=idx,[rest_of_fields]) 

    if(created): # this is when the object was created 

    else: # this is when the object with those PK's was found in database 
      # this is where I want to add the rest of fields, in other this linea I have the object retrieved from the DB 
      lineOrder.field1 = "empty" 
      lineOrder.save() 

Но когда я отладки приложение, которое я обнаружил, что независимо от того, сколько итераций у меня есть, create_or_Get() метод всегда возвращает PK первой строки.

Почему такое поведение?

ответ

2

Я думаю, peewee не набирает ограничения? Возможно, вам придется написать свою собственную реализацию, так как кажется, что вы хотите, чтобы что-то было немного иначе.

насчет всего:

try: 
    with db.atomic(): 
     return ProductOrderItem.create(order=orderObj, orderline=idx), True 
except IntegrityError: 
    return ProductOrderItem.get(
     (ProductOrderItem.order == orderObj) & 
     (ProductOrderItem.orderline == idx)) 
+0

решаемые @coleifer – MigRome