Как отфильтровать данные с двумя параметрами из двух разных моделей Django - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу создать объект JSON, который будет

  1. Искать конкретные проекты из модели "EmpProject" по определенному emp_id

  2. Поиск, статус проекта которого «Ожидает» из модели «Проект» с помощью (1.) Результат поиска

Я использую JSON Parser (без моделей или универсального представления)

Модели

Ниже приведены мои модели. Вместо этого я использовал поле «многие ко многим» вместо этого. Я создал Промежуточную таблицу, если решение также возможно при использовании manytomanyfield, чем также предлагает


class Employee(models.Model):
    employeeid = models.IntegerField()
    first_name = models.CharField(max_length=50)
    last_name = models.CharField(max_length=50)
    phone_no = models.CharField(max_length=10)
    date_of_birth = models.DateField()
    email = models.EmailField(unique=True)
    password = models.CharField(max_length=50)
    designation = models.CharField(max_length=50)
    dept_id = models.ForeignKey(Department, on_delete=models.SET_NULL, null=True, blank=True)

    class Meta:
        ordering = ('id',)

    def __str__(self):
        return self.emp_name


class Project(models.Model):
    projectname = models.CharField(max_length=50, unique=True,)
    project_status = models.CharField(max_length=50)
    description = models.TextField()
    start_date = models.DateField(auto_now_add=True)
    due_date = models.DateField()

    class Meta:
        ordering = ('id',)

    def __str__(self):
        return self.projectname

class EmpProject(models.Model):
    emp_id = models.ForeignKey(Employee,on_delete=models.SET_NULL, null=True, blank=True)
    project_id = models.ForeignKey(Project, on_delete=models.SET_NULL, null=True, blank=True)

    class Meta:
        unique_together = [['emp_id','project_id']]
        ordering = ('project_id',)

    def __str__(self):
        return self.emp_id

Сериализатор

class EmployeeSerializer(serializers.ModelSerializer):
    dept_id = serializers.SlugRelatedField(queryset=Department.objects.all(), slug_field='dept_name')

    class Meta:
        model = Employee
        fields = [
            'id',
            'employeeid',
            'first_name',
            'last_name',
            'phone_no',
            'date_of_birth',
            'email',
            'password',
            'designation',
            'dept_id',
        ]


class ProjectSerializer(serializers.ModelSerializer):

    class Meta:
        model = Project
        fields = [
            'id',
            'projectname',
            'project_status',
            'description',
            'start_date',
            'due_date'  ,
        ]


class EmpProjectSerializer(serializers.ModelSerializer):
    emp_id=serializers.SlugRelatedField(queryset=Employee.objects.all(),slug_field='employeeid')
    project_id=serializers.SlugRelatedField(queryset=Project.objects.all(),slug_field='projectname')
    class Meta:
        model = EmpProject
        fields = [
            'emp_id',
            'project_id',
        ]

1 Ответ

0 голосов
/ 04 ноября 2019

Вы можете попробовать что-то вроде этого:

Project.objects.filter(id__in=EmpProject.objects.filter(id__in=emp_id).values("project_id"), project_status="Pending")

Несколько моментов, заслуживающих упоминания:

  1. Хорошей идеей является использование промежуточной таблицы, когда нам нужны дополнительные данные, связанные сассоциация. Но для этого, пожалуйста, взгляните на атрибут through, поддерживаемый в ManyToManyField https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ManyToManyField.through
  2. project_status - это CharField, я думаю, вы должны рассмотреть ChoiceField, charfield может ввести много грязных данныхв базе данных.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...