2017-09-04 15 views
0

Djangoのget_or_createに問題があります。同じ日付で同じオブジェクトを作成したときに整合性エラーがポップアップします。Django IntegrityError with DateField - get_or_createでオブジェクトを作成するとき

私のモデルには次のようなフィールドがあります。私はカートに同じオブジェクトを追加しようとすると、

class Cart(models.Model): 
    created = models.DateTimeField(
     pgettext_lazy('Cart field', 'created'), auto_now_add=True) 
    last_status_change = models.DateTimeField(
     pgettext_lazy('Cart field', 'last status change'), auto_now_add=True) 
    user = models.ForeignKey(
     settings.AUTH_USER_MODEL, blank=True, null=True, related_name='carts', 
     verbose_name=pgettext_lazy('Cart field', 'user')) 
    email = models.EmailField(
     pgettext_lazy('Cart field', 'email'), blank=True, null=True) 

    def add(self,hoarding, date_from, date_until): 
     cart_line, created = self.lines.get_or_create(
      hoarding=hoarding,date_from=date_from,date_until=date_until) 



class Meta: 
     ordering = ('-last_status_change',) 
     verbose_name = pgettext_lazy('Cart model', 'Cart') 
     verbose_name_plural = pgettext_lazy('Cart model', 'Carts') 

    def __str__(self): 
     return smart_str(self.user) 


class CartLine(models.Model): 
    cart = models.ForeignKey(
     Cart, related_name='lines', 
     verbose_name=pgettext_lazy('Cart line field', 'cart')) 

    hoarding = models.ForeignKey(
     Hoarding, related_name='+',blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'hoarding')) 

    date_from = models.DateField(blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'from')) 

    date_until = models.DateField(blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'until')) 

    class Meta: 
     unique_together = ('cart', 'date_from', 'date_until') 
     verbose_name = pgettext_lazy('Cart line model', 'Cart line') 
     verbose_name_plural = pgettext_lazy('Cart line model', 'Cart lines') 

エラーが発生し、同じ日付からと日付まで:

IntegrityError at /hoardings/hoardings-demo-2-5/add/ 
UNIQUE constraint failed: cart_cartline.cart_id, cart_cartline.date_from, cart_cartline.date_until 

get_or_createはdates.Iが一意追加したのと同じでオブジェクトを作成IntegrityErrorを返します。 datefieldには機能がありますが、同じエラーがあります。 Django 1.11とPython 2.7を使用しています

データベースを数回リセットしましたが、データベースがPostgres/sqliteになっていませんでした。

+0

get_or_createオブジェクトを作成しようとするコードを追加します。 そして手動でCartLine(cart、date_from、date_until)またはunique = True to date_from/date_untilに手動で複雑なプライマリキーを追加しませんでしたか? –

+0

あなたのモデルの 'meta'クラスを追加しますか? –

+0

投稿したコードにこのモデルのコードに一意の制約はありません。 –

答えて

0

unique_togetherのCartLineモデルで完全性の問題が発生しています。その行を削除してから移行してください。

class CartLine(models.Model): 
    cart = models.ForeignKey(
     Cart, related_name='lines', 
     verbose_name=pgettext_lazy('Cart line field', 'cart')) 

    hoarding = models.ForeignKey(
     Hoarding, related_name='+',blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'hoarding')) 

    date_from = models.DateField(blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'from')) 

    date_until = models.DateField(blank=True, null=True, 
     verbose_name=pgettext_lazy('Cart line field', 'until')) 

    class Meta: 
     verbose_name = pgettext_lazy('Cart line model', 'Cart line') 
     verbose_name_plural = pgettext_lazy('Cart line model', 'Cart lines') 
関連する問題