【问题标题】:Django IntegrityError with DateField - when creating objects with get_or_create带有 DateField 的 Django IntegrityError - 使用 get_or_create 创建对象时
【发布时间】:2018-02-12 13:05:10
【问题描述】:

我在使用 Django 的 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 在创建具有相同日期的对象时将返回 IntegrityError。我在日期字段中添加了独特的功能,但得到了相同的错误。 我使用 Django 1.11 和 Python 2.7

我重置数据库几次,但没有帮助,db 是 Postgres/sqlite。

【问题讨论】:

  • 在您尝试 get_or_create 对象的位置添加代码。您是否在 Meta 中为 CartLine(cart, date_from, date_until) 或 unique=True 手动添加了复杂的主键到 date_from/date_until (或者只是包含了有问题的代码)?
  • 添加meta你模型的类如果你有?
  • 您发布的此模型代码中没有唯一约束。发布完整代码。
  • @EmilGeorgeJames 已更新,请参阅..

标签: python django django-models datefield


【解决方案1】:

CartLine 模型中的unique_together 导致完整性问题。删除该行,然后迁移。

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')

【讨论】:

    猜你喜欢
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-01-18
    • 2018-02-17
    • 1970-01-01
    相关资源
    最近更新 更多