基于foreignkey用户字段的Django Rest Framework视图集过滤问题
我正在做一个django项目。本项目中有两个模型。有一个基于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 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 trunapi/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)