Django rest框架:在许多项目上发布

时间:2018-12-14 09:34:57

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

我有一个TransactionType模型,并且已经实现了viewset方法来创建事务类型,如下所示。目前,我只能过帐此有效负载中所示的单个credit_account或debit_account项目:

{"name":"Repair and Maintenance","credit_account":16,"debit_account":38}

我要发布多个credit_accounts和debit_accounts,这样我的有效负载看起来像这样:

{"name":"Repair and Maintenance","credit_account":[16,4,5],"debit_account":[38,7]}

哪种方法最有效?

class TransactionType(models.Model):
    name = models.CharField(max_length=255)
    organization = models.IntegerField(null=True, blank=False)  
    credit_account = models.ManyToManyField(Account,related_name='credit_account', verbose_name="Account to Credit")
    debit_account = models.ManyToManyField(Account,related_name='debit_account',verbose_name="Account to Debit")

    def __str__(self):
        return '{}'.format(self.name)

viewset方法

def create(self, request, format=None):

    name = request.data['name']

    try:

        trans_type_obj = TransactionType.objects.create(name=name,
                credit_account=Account.objects.get(id=request.data['credit_account'
                ]),
                debit_account=Account.objects.get(id=request.data['debit_account'
                ]), organization=get_auth(request))

        serializer = CreateTransactionTypeSerializer(trans_type_obj)
    except Exception, e:
        raise e

    return Response(data=serializer.data,
                    status=status.HTTP_201_CREATED)

3 个答案:

答案 0 :(得分:1)

按如下所述使用ManyToManyField.add()

def create(self, request, format=None):
    name = request.data['name']

    try:

        trans_type_obj = TransactionType.objects.create(name=name, organization=get_auth(request))
        trans_type_obj.credit_account.add(*[credit_obj for credit_obj in Account.objects.filter(id__in=request.data['credit_account'])])
        trans_type_obj.debit_account.add(*[debit_obj for debit_obj in Account.objects.filter(id__in=request.data['debit_account'])])
        serializer = CreateTransactionTypeSerializer(trans_type_obj)
    except Exception, e:
        raise e

    return Response(data=serializer.data,
                    status=status.HTTP_201_CREATED)

UPDATE-1
正如@Daniel Roseman所说,无需列表理解也可以做到

trans_type_obj.credit_account.add(*Account.objects.filter(id__in=request.data['credit_account']))
trans_type_obj.debit_account.add(*Account.objects.filter(id__in=request.data['debit_account']))

答案 1 :(得分:0)

def create(self, request,*args, **kwargs):

        name = request.data.pop('name')
        credits = request.data.pop('credit_account')
        debits = request.data.pop('debit_account')
        try:

            trans_type_obj = TransactionType.objects.create(name=name, organization=get_auth(request))
            for item in credits:
                trans_type_obj.credit_account.add(item)
            for item in debits:
                trans_type_obj.debit_account.add(item)

            serializer = TransactionTypeSerializer(trans_type_obj)
        except Exception as e:
            raise e

        return Response(data=serializer.data, status=status.HTTP_201_CREATED)

答案 2 :(得分:0)

您可以使用以下字段创建一个序列化器

class TransactionTypeSerializer(serializers.ModelSerializer):
    credit_account = serializers.PrimaryKeyRelatedField(queryset=Account.objects.all(), many=True)
    debit_account = serializers.PrimaryKeyRelatedField(queryset=Account.objects.all(), many=True)

    class Meta:
         model = TransactionType
         fields = __all__

现在在视图中

def create(self, request, *args, **kwargs):
   serializer = TransactionTypeSerializer(data=request.data)
   serializer.is_valid(raise_exception=True)
   serializer.save()
   return Response(serializer.data)