Django: Определение 'present_company' из 'company_name' ManytoManyField
У меня есть 2 модели, Company и Employee, и определена история компании как ManytoManyField. Я пытаюсь сохранить текущее название компании сотрудника, которое я получаю из названия компании ManytoManyField. Каким должен быть метод для его сохранения?
Вот что я пробовал: Я попытался переопределить метод сохранения в Models.
models.py
from django.db import models
class Company(models.Model):
name = models.CharField(max_length=100)
def __str__(self) -> str:
return self.name
class Employee(models.Model):
name = models.CharField(max_length=100)
company_name = models.ManyToManyField(Company, blank=True)
present_company = models.CharField(max_length=100, blank=True)
def save(self):
super(Employee, self).save()
last_index = self.company_name.count()-1
self.present_company=str(Company.objects.filter(employee__name=self.name)[last_index])
super(Employee, self).save()
def __str__(self) -> str:
return self.name
При использовании этого метода я сталкиваюсь с двумя проблемами:
- I add/edit the models from the admin site, when I try to save the models and print the names of the company, it prints out the previous edit and not the latest one.
- The order of the companies is not according to the order in which I save the models.
Итак, какие могут быть изменения в этом методе, или, какой-то другой метод для выполнения этой работы.
В комментариях @Sahil упоминает, что он хочет, чтобы упорядочивание основывалось на том, когда сотрудники пришли в компанию.
когда вы используете поле Many-to-Many Django в бэкенде создал отдельную таблицу для отображения (сквозная таблица). вы можете видеть эту таблицу в DB. Теперь вы хотите получить подробности о Employee, к которой вы присоединились, вы можете создать таблицу (эта таблица такая же, как и поле Many-to-Many, но с дополнительными полями, такими как joined_in и т.д.) с такими подробностями, как указано ниже:
class EmployeeCompnyMap(models.Model):
employee = models.ForeignKey(
Employee, on_delete=models.CASCADE, related_name='employee_company_map')
company = models.ForeignKey(
Company, on_delete=models.CASCADE, related_name='company_employee_map')
is_active = models.BooleanField(default=True)
joined_on = models.DateField(auto_now_add=True)
resigned_on = models.DateField(blank=True, null=True)
Теперь, если вы хотите second_latest вы можете сделать следующее в вашей модели сохранения:
last_company = self.employee_company_map.all().order_by('-resigned_on')[1]