Почему Django NotExist удаляет другие объекты? - PullRequest
0 голосов
/ 30 марта 2020

У меня проблема с Django и особенно с использованием DidNotExist.

В моем скрипте я пытаюсь проверить, существует объект "Scrapper" или нет, если он не существует объект создан.

Для проверки, существует ли он или нет, я использую 'try catch Model.DoesNotExists', .get () с двумя параметрами: первый - это идентификаторы, а последний - объект User. .

Проблема возникает, когда два объекта Scrapper имеют одинаковые идентификаторы, но разных пользователей, создается первый «Scrapper», а второй стирает первый.


try:
    a = Scrapper.objects.get(id_lbc=ids, user=user)
except Scrapper.DoesNotExist:
    a = Scrapper(
        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()


Model

class Scrapper(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

Я хочу создать два объекта Scrapper с одинаковыми идентификаторами, но разными пользователями, например

Scrapper N ° 1
идентификаторы = 1234567
user = Nico (объект )

Scrapper N ° 2
id = 1234567
user = Paul (object)

Я думал, что с учетом заданного объекта User запрос Django может увидеть разницу между два объекта Scrapper, но я что-то неправильно понял ... может быть, PK в моей модели?

Спасибо за помощь

Ответы [ 2 ]

1 голос
/ 30 марта 2020

Не используйте Scrapper напрямую для создания объекта, вместо этого вызовите Scrapper.objects.create(...)

1 голос
/ 30 марта 2020

Вы не можете делать то, что вы хотите с вашей текущей моделью. Это потому, что id_lbc установлен в качестве первичного ключа. Это означает, что он должен быть уникальным, вы не можете иметь два значения, разделяющих это значение. Однако вы можете сделать следующее:

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

Это сделает так, что id_lbc может иметь дубликаты в таблице, если каждое значение имеет различное значение user.

Тогда вы также должны использовать Scrapper.objects.get_or_create:

a, created = Scrapper.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,
})
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...