【发布时间】:2018-02-19 13:37:11
【问题描述】:
我在使用 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。
【问题讨论】:
-
你在模型的
Meta类中写过什么吗? -
您发布的模型代码中没有唯一性约束。要么您没有发布完整的代码,要么已经在 db 级别声明了唯一性约束或其他任何内容,但是由于我们无法仅使用此代码重现错误,因此我们无能为力。
-
@zaidfazil class
Meta已添加,请看? -
@user3334294 既然您添加了
Meta类,那么导致此问题的是CartLine模型中的unique_together。只需删除该行并迁移(或重新创建数据库,因为您似乎处于允许这样做的阶段)。 -
@user3334294 成功了,非常感谢。
标签: python django postgresql django-models datefield