【问题标题】:How to get an url with username as slug parameter django rest framework如何获取用户名作为 slug 参数 django rest 框架的 url
【发布时间】:2020-09-22 12:39:54
【问题描述】:

我有一个带有用户模型的 onetoone 字段的平衡模型,因此每个用户都有一个与他们自己相关的“平衡”。这是我的模型:

class Balance(models.Model):
    user = models.OneToOneField(User, blank=True, on_delete=models.CASCADE)
    balance = models.DecimalField(default=0, max_digits=8, decimal_places=2, blank=True)

@receiver(post_save, sender=User)
def create_balance(sender, instance, **kwargs):
    if kwargs.get('created', False):
        Saldos.objects.get_or_create(user=instance)
        print('created balance model to user')

这是我的序列化器

from django.contrib.auth.models import User
from rest_framework import serializers

class OwnerSerializer(serializers.ModelSerializer):
    class Meta:
        model = User
        fields = ['username']

class BalanceSerializer(serializers.ModelSerializer):
    user = OwnerSerializer(read_only=True)    

    class Meta:
        model = Balance
        fields = '__all__'

这是我的看法

from .models import Balance
from rest_framework import viewsets
from .serializers import BalanceSerializer

class BalanceViewSet(viewsets.ModelViewSet):

    queryset = Balance.objects.all()
    serializer_class = BalanceSerializer

这是我的 urls.py

from django.urls import include, path
from rest_framework import routers
from .views import BalanceViewSet

router = routers.DefaultRouter()
router.register(r'api/balance', BalanceViewSet)

urlpatterns = [
    path('', include(router.urls)),
]

这很好用,问题是我希望每个用户的网址都像 http://127.0.0.1:8000/api/balance/username 而不是 http://127.0.0.1:8000/api/balance/1

有什么方法可以将与余额相关的用户名放在 url 中?

【问题讨论】:

  • BalanceSerializer你使用的是Saldos,它是从哪里来的?
  • @Md.TanvirRaihan 哦,应该是模型平衡,抱歉我刚刚编辑了

标签: python django python-3.x api django-rest-framework


【解决方案1】:

您可以在序列化程序中添加 StringRelatedField:

username = serializers.StringRelatedField(source='user', read_only=True)

【讨论】:

【解决方案2】:

在您的 Balance 模型中添加一个 slug 字段,

class Balance(models.Model):
    .....
    slug = models.CharField(max_length=50, unique=True) # make it unique

运行迁移命令。

然后在BalanceSerializer

class BalanceSerializer(serializers.ModelSerializer):
    user = OwnerSerializer(read_only=True)    

    class Meta:
        model = Balance
        fields = '__all__'
        lookup_field = 'slug'

然后在你看来,

class BalanceViewSet(viewsets.ModelViewSet):    
    queryset = Balance.objects.all()
    serializer_class = BalanceSerializer
    lookup_field = 'slug'

现在试试http://127.0.0.1:8000/api/balance/your-slug

注意:我不在本地测试它,但它应该可以工作。

【讨论】:

  • 是的,我虽然这是一个可能的解决方案,但是我应该为每个用户手动添加 slug,如果有办法将 slug 字段设置为与默认用户名
  • 您可以覆盖.save() 方法,然后使用您的用户名创建一个slug。那么你就不需要手动添加slug了。
猜你喜欢
  • 2018-09-17
  • 1970-01-01
  • 1970-01-01
  • 2018-07-06
  • 2017-09-15
  • 2022-06-14
  • 1970-01-01
  • 1970-01-01
  • 2022-08-18
相关资源
最近更新 更多