не создавайте дублирующиеся объекты. django, python

#python #django #command

#python #django #команда

Вопрос:

Я создал скрипт, чтобы избежать создания повторяющихся объектов, но он по-прежнему создавал одни и те же объекты, когда я запускаю команду 3 раза, она создает их 3 раза снова и снова. Я хотел бы, чтобы вы помогли мне и знали, что не так с моим кодом.

 from django.core.management.base import BaseCommand
from jobs.models import Job
import json
from datetime import datetime
import dateparser


class Command(BaseCommand):
    help = 'Set up the database'

    def handle(self, *args: str, **options: str):
        with open('static/newdata.json', 'r') as handle:
            big_json = json.loads(handle.read())
            for item in big_json:
                if len(item['description']) == 0:
                    print('Not created. Description empty')
                    continue

                dt = dateparser.parse(item['publication_date'])

                existing_job = Job.objects.filter(

                    job_title = item['job_title'],
                    company = item['company'],
                    company_url = item['company_url'],
                    description = item['description'],
                    publication_date = dt,
                    salary = item['salary'],
                    city = item['city'],
                    district = item['district'],
                    job_url = item['job_url'],
                    job_type = item['job_type'],

                )
                if existing_job.exists() is True:
                    print('This Job already exist')
                else:
                    Job.objects.create(

                        job_title = item['job_title'],
                        company = item['company'],
                        company_url = item['company_url'],
                        description = item['description'],
                        publication_date = dt,
                        salary = item['salary'],
                        city = item['city'],
                        district = item['district'],
                        job_url = item['job_url'],
                        job_type = item['job_type'],

                )

                self.stdout.write(self.style.SUCCESS('added jobs!'))
 

Ответ №1:

Вы пробовали использовать встроенную проверку полей unique=True ? https://docs.djangoproject.com/en/3.1/ref/models/fields/#unique

Комментарии:

1. ммм, нет, потому что все поля должны быть одинаковыми, чтобы избежать дублирования. 2 задания могут иметь одинаковое название, но отличаться в остальных полях

Ответ №2:

попробуйте

 if existing_job.exists():
 

вместо

 if existing_job.exists() is True:
 

потому что .exists() возвращает само логическое значение

Комментарии:

1. да. но я получил тот же результат

2. как вам грустно, что он создает объекты. итак, ваша проблема должна быть в операторе if и existing_job . сосредоточьтесь на них. вы можете устанавливать точки в этих строках и отлаживать их

Ответ №3:

Вы пробовали использовать unique_together без поля publication_date? Документы

 # models.py
class Job(models.Model):
    # Your fields here...

    class Meta:
        unique_together = [[
            'job_title',
            'company',
            'company_url',
            'description',
            'salary',
            'city',
            'district',
            'job_url',
            'job_type'
        ]]

 

Комментарии:

1. Возможно ли, что значения отличаются неочевидным образом? Возможно, разные буквы регистра, разные интервалы?

2. нет, они одинаковые. потому что я запускаю код 3 раза из данных JSON.

3. Итак, я так понимаю, вы получаете 3 «версии» каждой строки из файла JSON?

4. Я не очень понимаю, о чем вы говорите. дело в том, что когда я запускаю команду, она создает задания в этих полях. если я снова запущу. он не должен создавать никаких заданий, потому что это один и тот же файл JSON с теми же данными.

5. Когда вы снова запускаете команду, создает ли она каждую строку во второй раз?

Ответ №4:

 dt = dateparser.parse(item['publication_date'])
new_date = date(dt.year, dt.month, dt.day)
 

вот в чем была проблема. Я очищаю дату публикации в этом формате («1 неделя назад»), а затем меняю формат даты и времени. и когда я снова запускаю скрипт, время преобразования — это другое время. вот почему задание создается снова. потому что это не то же самое, потому что время создания