基于外键用户字段的Django Rest Framework ViewSet过滤问题

时间:2019-01-29 02:31:12

标签: django django-rest-framework django-rest-viewsets

我有一个正在处理的django项目。该项目有两个模型。有VARCHAR(16)user模型。我正在整合django rest框架视图集。我将在下面包括它们。我现在将Django Rest Framework集成到项目中。我试图找出如何做两件事。

2种型号:

默认django用户

帐户模型:

account

1 =>我希望能够输入端点class Account(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) _id = models.CharField(max_length=45) name = models.CharField(max_length=140) balance = models.DecimalField(max_digits=100, decimal_places=2) currency = models.CharField(max_length=12) bank_name = models.CharField(max_length=120) routing = models.CharField(max_length=8) _class = models.CharField(max_length=22) type = models.CharField(max_length=22) active = models.BooleanField(default=True) main = models.BooleanField(default=False) synapse = models.BooleanField(default=False) create_at = models.DateTimeField(auto_now_add=True) def __str__(self): return self.user.username + ' - ' + self.name + ': ' + str(self.balance) 并使用omarjandali用户Foreignkey来获取单个或多个帐户

2 =>我希望能够输入以下内容 /api/users/accounts/omarjandlai并返回数据库中的所有帐户

我尝试了4-5种不同的方法来使其正常工作,但我无法使其正常工作。

这是我的序列化器和视图

序列化器:

api/users/accounts/

观看次数:

class AccountSerializer(serializers.ModelSerializer):
    class Meta:
        model = Account
        fields = ('user', '_id', 'name', 'balance', 'currency', 'bank_name',
                  'routing', '_class', 'type', 'active', 'main', 'synapse')

发生的事情是当我这样做时

class AccountViewSet(viewsets.ModelViewSet): queryset = Account.objects.all(); serializer_class = AccountSerializer filter_backends = (filters.DjangoFilterBackend,) filter_fields = ('user',) 我看到了所有帐户

api/users/account我得到api/users/account/omarjandali

网址:

detail not found

1 个答案:

答案 0 :(得分:1)

我可以看到您正在使用 DefaultRouter 的默认功能。这样,您只能使用它们的主键访问记录详细信息。由于您没有明确指定任何字段作为主键(primary=True),因此 Django 将字段 id 设置为PositiveIntegerField作为主键模型的因此,如果要访问记录的详细信息,则必须使用api/users/account/112/

您可以使用过滤器api/users/account/?search='omarjandali'按名称访问记录,但是您需要添加SearchFilter

from rest_framework.filters import SearchFilter 

class AccountViewSet(viewsets.ModelViewSet):
    queryset = Account.objects.all();
    serializer_class = AccountSerializer
    filter_backends = (filters.DjangoFilterBackend, SearchFilter)
    filter_fields = ('user',)
    search_fields = ('name',)

如果您要坚持使用网址格式api/users/account/omarjandali/,则必须将其添加到 urls.py 并使用其他视图集,以使原始视图集能够相应地作用于< strong> DefaultRouter 定义:

urls.py:

router = DefaultRouter()
router.register(r'users', UserViewSet, basename='user')
router.register(r'accounts', AccountViewSet, basename='account')

urlpatterns = [
    path('', include(router.urls)),
    path('api/users/account/<str:username>/', views.GetRecordsByNameViewSet.as_view({'get': 'list'}),
]

views.py

from rest_framework.response import Response

class GetRecordsByNameViewSet(viewsets.ViewSet):
    def list(self, request, username):
        accounts = Account.objects.filter(user__username=username)
        accounts_to_return = AccountSerializer(accounts, many=True).data

        return Response(accounts_to_return)