【问题标题】:How do I filter data with two parameter from two different Django models如何使用来自两个不同 Django 模型的两个参数过滤数据
【发布时间】:2019-11-04 08:04:48
【问题描述】:

我想创建一个 JSON 对象

  1. 通过特定 emp_id 从模型“EmpProject”中搜索特定项目

  2. 借助(1.)搜索结果从模型“Project”中搜索其项目状态为“Pending”的项目

我正在使用 JSON Parser(没有模型或通用视图)

型号

下面是我的模型


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',
        ]

【问题讨论】:

    标签: django django-models django-rest-framework


    【解决方案1】:

    你可以试试这样的:

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

    值得一提的几点:

    1. 当我们想要获得与关联相关的额外数据时,最好使用中间表。但是,请查看ManyToManyField 中支持的through 属性@https://docs.djangoproject.com/en/2.2/ref/models/fields/#django.db.models.ManyToManyField.through
    2. project_statusCharField,我认为你应该考虑ChoiceField,charfield 可能会在数据库中引入大量脏数据。

    【讨论】:

    • 因为我使用的是 Model Serailizer,所以它不起作用,您的代码需要两个序列化器
    • 您能详细说明一下吗?
    • 这是我接受 emp_id 作为参数的观点 我应该如何在这里使用您的代码? ************************ @csrf_exempt def project_list_name(request, empid): projects = Project.objects.filter(id__in=EmpProject.objects.filter( id__in=empid).values("project_id"), project_status="Pending") if request.method == 'GET': projects_serializer = ProjectSerializer(projects, many=True) return JsonResponse(projects_serializer.data, safe=False) * *********
    • 您遇到了什么错误?我认为您需要将项目作为实例属性传递给序列化程序。
    • projects_serializer = ProjectSerializer(projects, many=True) 我将项目实例传递给序列化程序
    猜你喜欢
    • 2021-12-08
    • 1970-01-01
    • 2013-05-28
    • 1970-01-01
    • 2011-01-09
    • 1970-01-01
    • 2023-03-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多