сравнение объектов в views.py из 2-х различных моделей объектов в Django

#python #html #django #django-views #compare

Вопрос:

Я пытаюсь сравнить 2 объекта (навыки публикации вакансии, такие как веб-разработка, маркетинг и т. Д., С теми же навыками зарегистрированного пользователя), Если они совпадут, отобразится эта публикация.

Цель состоит в том, чтобы отобразить несколько объявлений о вакансиях, соответствующих пользователю. В настоящее время, jobmatch.html не отображает никаких заданий.

Спасибо, что нашли время!!

views.py

 from apps.job.models import Job from apps.userprofile.models import User_profile  def match_jobs(request):  match_jobs = {}  for job in Job.objects.all():  if job.product_management == User_profile.product_management:  match_jobs['product management'] = job  elif job.web_development == User_profile.web_development:  match_jobs['web development'] = job  elif job.user_experience == User_profile.user_experience:  match_jobs['user experience'] = job  elif job.marketing == User_profile.marketing:  match_jobs['marketing'] = job  elif job.finance == User_profile.finance:  match_jobs['finance'] = job   return render(request, 'jobmatch.html', match_jobs)  

Job.models.py

 class Job(models.Model):  title = models.CharField(max_length=255)   location = models.CharField(max_length=255, blank=True, null=True)  description = models.TextField()  requirements = models.TextField(blank=True, null=True)  product_management = models.BooleanField(default=False)  web_development = models.BooleanField(default=False)  user_experience = models.BooleanField(default=False)  marketing = models.BooleanField(default=False)  finance = models.BooleanField(default=False)  

User.models.py

 class User_profile(models.Model):  user = models.OneToOneField(User, related_name='userprofile', on_delete=models.CASCADE)  is_employer = models.BooleanField(default=False)  resume = models.ImageField(default='default.jpg', upload_to='resume')  full_name = models.CharField(max_length=255, default='Enter full name')  relevant_background = models.TextField()  product_management = models.BooleanField(default=False)  web_development = models.BooleanField(default=False)  user_experience = models.BooleanField(default=False)  marketing = models.BooleanField(default=False)  finance = models.BooleanField(default=False)  

jobmatch.html

 {% for job in match_jobs %}  lt;div class="colum is-4"gt;  lt;div class="card"gt;  lt;div class="card-content"gt;  lt;div class="media"gt;  lt;div class="media-content"gt;  lt;p class="title is-4"gt;{{ job.title }}lt;/pgt;  lt;p class="subtitle is-6"gt;{{ job.created_at }}lt;/pgt;  lt;/divgt;  lt;/divgt;   lt;div class="content"gt;  {{ job.location }}   lt;brgt;   lt;a href="{% url 'job_detail' job.id %}"gt;Viewlt;/agt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  lt;/divgt;  {% endfor %}  

Ответ №1:

Вам нужно перепроектировать свои модели.

Храните все навыки в отдельной таблице.

 class Skill(models.Model):  name = models.CharField(max_length=50) # example web development  

Теперь вы можете связать свою модель работы и профиля пользователя с моделью навыков с помощью множества отношений.

 class Job(models.Model):  ......  skills = models.ManyToManyField(Skill)   class UserProfile(models.Model): .........  skills = models.ManyToManyField(Skill)  

Теперь вы можете получить подходящую работу с помощью этого.

 user_skills = request.user.userprofile.skills.all()  matched_jobs = Job.objects.filter(skills__in=user_skills)  

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

1. Другое преимущество этого подхода заключается в том, что вы можете затем расширить его, сохранив важность навыка для работы или уровень мастерства человека за столом, который управляет отношениями «многие ко многим», чтобы выполнять матчи, которые являются гибкими, чем есть/нет навыка.

2. Спасибо! На самом деле у меня есть филиал, использующий аналогичный метод с ManyToManyField(Навык), но как мне создать конкретные навыки, такие как веб-разработчик и т. Д.? Я пытаюсь создать логические поля, чтобы они могли быть флажками, а затем сопоставлять их. class User_profile(models.Model): user_skills = models.ManyToManyField('UserSkills', related_name='user_profiles', blank=True) class UserSkills(models.Model): web_development = models.BooleanField(default=False, null=True, blank=True)

Ответ №2:

Вы можете создать Skill модель для создания любых навыков, которые вы хотите, а также связать их с заданиями и пользователями, использующими ManyToManyField их . Это позволит легко добавлять, обновлять или удалять любые навыки.

 class Skill(models.Model):  name = models.CharField(max_length=250)  class Job(models.Model):  title = models.CharField(max_length=255)   location = models.CharField(max_length=255, blank=True, null=True)  description = models.TextField()  requirements = models.TextField(blank=True, null=True)  skills = models.ManyToManyField(Skill, blank=True, related_name='as_job_skill')  class User_profile(models.Model):  user = models.OneToOneField(User, related_name='userprofile', on_delete=models.CASCADE)  is_employer = models.BooleanField(default=False)  resume = models.ImageField(default='default.jpg', upload_to='resume')  full_name = models.CharField(max_length=255, default='Enter full name')  relevant_background = models.TextField()  skills = models.ManyToManyField(Skill, blank=True, related_name='as_user_skill')  

Вы также можете очень легко найти подходящие задания для пользователей.

 def match_jobs(request):  user_profile = request.user.userprofile  matched_jobs = Job.objects.filter(skills__in=user_profile.skills.all()).distinct()  return render(request, 'jobmatch.html', matched_jobs)  

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

1. Спасибо! Я пробовал много раз, но застрял. Как я могу создать несколько экземпляров имени? Я уже разделял их раньше: class UserSkills(models.Model): product_management = models.BooleanField(default=False, null=True, blank=True) web_development = models.BooleanField(...

2. Вы можете зарегистрировать модель навыков на сайте администратора, а затем добавить навыки там. Чтобы выбрать навык для пользователя или работу, просто сделайте lt;job instance/user_profile instancegt;.skills.add(lt;skill instancegt;) это . и используйте remove метод, чтобы удалить эти добавленные навыки. И чтобы получить доступ к заданиям с определенным навыком, просто сделайте lt;skill instancegt;.as_job_skill.all() это .

Ответ №3:

Теперь у вас есть итерация по клавишам dict. Вы должны сделать что-то вроде: {% for job in match_jobs.values %} или {% for job_identifier, job in match_jobs.items %}

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

1. Спасибо, это было то, что я искал, но ни то, ни другое не сработало. Может быть, в моем коде что-то еще не так?