【问题标题】:Why Django DoesNotExist Erase other objects?为什么 Django DoesNotExist 擦除其他对象?
【发布时间】:2020-03-30 14:53:04
【问题描述】:

我在使用 Django 时遇到了问题,特别是在使用 DoesNotExist 时遇到了问题。

在我的脚本中,我正在尝试检查“Scraper”对象是否存在,如果不存在,则创建对象。

为了检查它是否存在,我正在使用带有两个参数的“try catch Model.DoesNotExists”,.get(),第一个是 ID,最后一个是用户对象。

当两个 Scraper 对象具有相同的 ID 但用户的 ID 不同时,问题就出现了,第一个“Scraper”被创建,第二个擦除第一个。


try:
    a = Scraper.objects.get(id_lbc=ids, user=user)
except Scraper.DoesNotExist:
    a = Scraper(
        id_lbc=ids,
        lbc_name=title,
        lbc_url=url,
        lbc_image=image,
        lbc_price=price,
        lbc_date=date,
        lbc_city=city,
        lbc_price_meter=price_meter,
        user=user,
        token_url=token,
        customer=customer,
        has_phone=phone,
    )
    a.save()


型号

class Scraper(models.Model):
    id_lbc = models.IntegerField(primary_key=True)
    lbc_name = models.CharField(max_length=300)
    lbc_url = models.URLField(max_length=300)
    lbc_image = models.URLField(
        max_length=300, default='http://****/****/nothing.jpg')
    lbc_price = models.IntegerField(blank=True, null=True)
    lbc_price_meter = models.IntegerField(blank=True, null=True)
    lbc_city = models.CharField(max_length=300)
    lbc_date = models.DateTimeField(auto_now=False)
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    token_url = models.ForeignKey(
        Url_lbc, to_field='token', on_delete=models.CASCADE)
    is_emailed = models.BooleanField(default=False)
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE)
    has_phone = models.BooleanField(default=False)

    def __str__(self):
        return self.lbc_name

我想要的是创建两个具有相同“id”但用户不同的 Scraper 对象 例如

刮板 N°1
ID = 1234567
用户 = Nico(对象)

刮板 N°2
ID = 1234567
用户 = 保罗(对象)

我认为在给定 User 对象的情况下,Django 查询可以看到两个 Scraper 对象之间的区别,但我误解了一些东西......也许是我模型中的 PK ?

感谢您的帮助

【问题讨论】:

  • 仅供参考,它是 scraper(以及 scrapingscrapedscrape)而不是 scrapper。 “废弃”意味着像垃圾一样扔掉:-(

标签: python django postgresql django-models


【解决方案1】:

你不能用你当前的模型设计做你想做的事。这是因为id_lbc 被设置为主键。这意味着它必须是独一无二的,你不能让两个实例共享该值。你可以做的是:

class Scraper(models.Model):
    id_lbc = models.IntegerField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    ...
    class Meta:
        unique_together = [('user', 'id_lbc')]

这将使id_lbc 在表中可以有重复项,只要每个值具有不同的user 值。

那么你也应该使用Scraper.objects.get_or_create:

a, created = Scraper.objects.get_or_create(id_lbc=ids, user=user, defaults={
    'lbc_name': title,
    'lbc_url': url,
    'lbc_image': image,
    'lbc_price': price,
    'lbc_date': date,
    'lbc_city': city,
    'lbc_price_meter': price_meter,
    'token_url': token,
    'customer': customer,
    'has_phone': phone,
})

【讨论】:

    【解决方案2】:

    不要直接使用Scraper创建对象,而是调用Scraper.objects.create(...)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-04-10
      • 1970-01-01
      • 1970-01-01
      • 2021-09-04
      • 2020-12-27
      • 2020-01-09
      • 2018-08-18
      • 2015-06-23
      相关资源
      最近更新 更多