首页 > 解决方案 > 如何让非pk值成为在django rest框架中发出post请求的值

问题描述

正如问题所述,我希望能够在 post 请求中传递一个不同的值,比如用户名“bob”而不是 1,而不是必须在我的 JSON 请求中传递 PK。所以想法是而不是我的请求包含:

{
    "client": 1,
    "urgent": true,
    "article": 1,
    "quantity": 1,
    "order_to": 1
}

它应该包含:

{
    "client": "bob",
    "urgent": true,
    "article": 234,
    "quantity": 1,
    "order_to": 1
}

这是我的相关模型:

class UserModel(models.Model):
    MEMBERSHIP_TYPE = [
    ('NM', 'NORMAL'),
    ('PT', 'PLATA'),
    ('OR', 'ORO'),
    ('PL', 'PLATINO'),
]
    id = models.AutoField(primary_key=True)
    username = models.CharField(max_length=100, unique=True)
    photo = models.ImageField(upload_to='images/', blank=True)
    address = models.TextField()
    client_type = models.CharField(max_length=2,
        choices=MEMBERSHIP_TYPE,
        default= 'NM')

    def __unicode__(self):
        return self.name

class ArticleModel(models.Model):
    id = models.AutoField(primary_key=True)
    code = models.IntegerField(unique=True)
    description = models.TextField()
    
    def __str__(self):
        return str(self.code)

class SupplierModel(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=100)
    address = models.TextField()
    articles = models.ManyToManyField(ArticleModel)
    def __str__(self):
        return self.name

class OrderModel(models.Model):
    id = models.AutoField(primary_key=True)
    client = models.ForeignKey('UserModel', on_delete=models.CASCADE)
    gen_time = models.DateTimeField(auto_now_add=True)
    gen_supplied = models.DateTimeField(null=True, blank=True)
    urgent = models.BooleanField()
    order_to = models.ForeignKey('OrderToModel', on_delete=models.CASCADE)
    article = models.ForeignKey('ArticleModel', on_delete=models.CASCADE)
    quantity= models.IntegerField()

和序列化器:

class OrderCreateSerializer(serializers.ModelSerializer):

    # order_to = OrderToPolymorphicSerializer()
    class Meta:
        model = OrderModel
        fields = ('client', 'urgent', 'article', 'quantity', 'order_to')

非常感谢您的帮助。先感谢您。

标签: djangodjango-rest-framework

解决方案


你可以这样做


class OrderCreateSerializer(serializers.ModelSerializer):
    client = serializers.SlugRelatedField(
        slug_field='username',
        queryset=UserModel.objects.all()
    )
    article = serializers.SlugRelatedField(
        slug_field='code',
        queryset=ArticleModel.objects.all()
    )

    class Meta:
        model = OrderModel
        fields = ('client', 'urgent', 'article', 'quantity', 'order_to')

推荐阅读