基于foreignkey用户字段的Django Rest Framework视图集过滤问题

基于foreignkey用户字段的Django Rest Framework视图集过滤问题,django,django-rest-framework,django-rest-viewsets,Django,Django Rest Framework,Django Rest Viewsets,我正在做一个django项目。本项目中有两个模型。有一个用户和帐户模型。我正在集成django rest框架视图集。我将把它们包括在下面。我现在正在项目中集成Django Rest框架。我想弄清楚如何做两件事 2款: 默认django用户 账户模式: class Account(models.Model): user = models.ForeignKey(User, on_delete=models.CASCADE) _id = models.CharField(max_len

我正在做一个django项目。本项目中有两个模型。有一个
用户
帐户
模型。我正在集成django rest框架视图集。我将把它们包括在下面。我现在正在项目中集成Django Rest框架。我想弄清楚如何做两件事

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
I未找到详细信息

网址:


我可以看到您正在使用默认路由器的默认功能。这样,您只能使用记录的主键访问记录的详细信息。由于您没有明确指定任何字段作为主键(
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',)
如果您想坚持url模式
api/users/account/omarjandali/
,则必须将其添加到url.py并使用另一个视图集,以便让原始视图集根据DefaultRouter定义运行:

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

请分享你的
URL.py
我将把它添加到底部的原始帖子@hugolisvillaloboscanto我想传递一个
,然后根据用户模型
用户名字段进行过滤。上面的代码会这样做吗。如果没有用户名被传递到url中,我想获取数据库中的所有帐户。我想使用该参数
username
而不是主键…我做了一些编辑来处理您的评论。使用此代码,您可以将其作为参数传递,并获得与之相等的所有记录。您还可以获取
帐户中的所有记录
如果您没有传递任何
用户名
谢谢,我会试试。我已经尝试解决这个问题两天了。我有一个不同的堆栈溢出问题,我在一个解决方案上兜圈子。祝你好运。如果您想尝试更复杂的搜索查询,请选中此项:我想使用第二个推荐的方法,但在/api/users/account/omarjandali/cangomodelpermissionsoranonredonly上出现了以下错误:
AssertionError at/api/users/account/omarjandali/无法对未设置
.queryset`或具有
.get\u queryset()的视图应用DjangModelPermissions
method.`i trun
api/users/account/omarjandali
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'}),
]
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)