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

При использовании этого метода я сталкиваюсь с двумя проблемами:

  1. 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.
  2. 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]
Вернуться на верх