#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 неделя назад»), а затем меняю формат даты и времени. и когда я снова запускаю скрипт, время преобразования — это другое время. вот почему задание создается снова. потому что это не то же самое, потому что время создания