1

我有一个正在处理的 django 项目。这个项目有两个模型。有一个useraccount模型。我正在集成 django rest 框架视图集。我将在下面包括它们。我现在正在项目中集成 Django Rest Framework。我试图弄清楚如何做两件事。

2个型号:

默认django用户

账户模式:

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)

1 => 我希望能够输入端点/api/users/accounts/omarjandlai并使用 omarjandali 用户外键获取单个或多个帐户

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

我尝试了 4 - 5 种不同的方法来让它工作,但我无法让它工作。

这是我的序列化程序和视图

序列化器:

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

网址:

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

2 回答 2

1

我可以看到您正在使用DefaultRouter的默认功能。这样,您只能使用他们的主键访问记录详细信息。由于您没有明确指定任何字段作为主键 ( primary=True),Django设置字段idPositiveIntegerField作为模型的主键。因此,如果您想访问记录的详细信息,您必须使用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',)

如果您想坚持使用 url 模式api/users/account/omarjandali/,则必须将其添加到urls.py并使用另一个视图集,以便让原始视图集根据DefaultRouter定义运行:

网址.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'}),
]

视图.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)
于 2019-01-29T03:26:59.000 回答
0

您可以尝试覆盖

get_queryset(方法)

这样就无需在 URL 中提供用户名/电子邮件。你会做 localhost8000/accounts,它只会显示相应用户的帐户。

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

    def get_queryset(self):
        queryset = super().get_queryset()
        queryset = queryset.filter(user=self.request.user)
        return queryset

注意:如果在项目中设置了身份验证,这将起作用。在令牌身份验证的情况下,您需要在授权标头中提供一个令牌。

于 2021-11-09T11:45:22.553 回答