【问题标题】:How to use filter in serializers using django rest framework如何使用 django rest 框架在序列化器中使用过滤器
【发布时间】:2018-07-26 08:54:23
【问题描述】:

我们需要帮助

如何实现以下...

在这里,我有两个模型 example1 和 example2,因为我已经使用序列化器加入了两个表,现在我想在 example2serializer 或 example2viewsets 中使用字段 (patient_n_key,centre_master_short_name) 进行过滤

models.py

class Example1(models.Model):

    patient_id = models.AutoField(primary_key=True)
    patient_n_key = models.CharField(max_length=15, blank=True, unique=True)
    centre_master_short_name = models.CharField(blank=False, max_length=33)

    class Meta:
        managed = False
        ordering = ['patient_id']
        db_table = 'example1'

class Example2(models.Model):

    appointment_id = models.AutoField(primary_key=True)
    appointment_n_key = models.CharField(max_length=15, blank=True)
    patient_n_key = models.ForeignKey('Example1', 
    db_column='patient_n_key', to_field='patient_n_key', 
    on_delete=models.CASCADE, related_name="Example2_id")
    centre_master_short_name = models.CharField(blank=False, max_length=33)

    class Meta:
        managed = False
        ordering = ['appointment_id']
        db_table = 'example2'

serializers1.py

class Example1serializer(serializers.ModelSerializer):
    class Meta:
        model=models.Example1
        fields='__all__'   

class Example2Serializer(serializers.ModelSerializer):
patient_n_key = Example1serializer(read_only=True)
    class Meta:
        model=models.Example2
        fields='__all__'

views.py

class Example1viewset(viewsets.ModelViewSet):
    queryset=models.Example1.objects.all()
    serializer_class=serializers1.Example1serializer
    lookup_field = 'patient_n_key'

class Example2viewset(viewsets.ModelViewSet):
    queryset=models.Example2.objects.all()
    serializer_class=serializers1.Example2serializer
    lookup_field = 'appointment_n_key'

urls.py

router.register(r'example1', views.Example1viewset, 
base_name='example1')
router.register(r'example2', views.Example2viewset, 
base_name='example2')

如何在 django rest 框架中使用视图集进行过滤?或者,如果有任何其他首选方式,请列出。谢谢。

【问题讨论】:

  • 使用 django_filters 这应该可以通过简单地为您的模型创建一个过滤器类,然后将其附加到您的视图集来实现。查看与 DRF 集成的文档页面:django-filter.readthedocs.io/en/latest/guide/…
  • 显示错误,因为“Example1”对象不可迭代
  • 你在哪里得到这个错误?由于我不确定您是如何设置的,因此很难准确判断出了什么问题。
  • filter_backends = (DjangoFilterBackend) filter_fields = ('centre_master_short_name','patient_n_key') 这是views.py中的代码这里只有我得到那个错误
  • 嗨,Erik Svedin,我已经更新了代码,请您检查一下。

标签: django python-3.x django-rest-framework django-serializer django-rest-viewsets


【解决方案1】:

您可以为此使用 django-filtes 库

class Example1viewset(viewsets.ModelViewSet):
    queryset=models.Example1.objects.all()
    serializer_class=serializers1.Example1serializer
    lookup_field = 'patient_n_key'
    filter_backends = (DjangoFilterBackend)
    filter_fields = ('centre_master_short_name','patient_n_key')

【讨论】:

  • 谢谢 Mr.aman kumar。我已经使用了上面的代码,但它显示错误,因为“Example1”对象不可迭代
  • 你能给我控制台日志吗
猜你喜欢
  • 2021-02-17
  • 1970-01-01
  • 2016-03-31
  • 2015-04-03
  • 1970-01-01
  • 2015-06-29
  • 1970-01-01
  • 2021-04-15
  • 2014-02-17
相关资源
最近更新 更多