验证失败-必填字段。 ManyToMany序列化Django

问题描述 投票:0回答:1

我具有要序列化以创建两个对象Account和AccountClub的表单数据。 AccountClub是“帐户”和“俱乐部”之间的中间表,带有附加字段,“返还”和“ chip_value”。

我可以序列化表单数据,但是当我在保存之前调用is.valid()函数时,我得到一个错误,其中许多字段为空

这是我的模特:

class Account(models.Model):
nickname = models.CharField(max_length=64)
club_account_id = models.IntegerField()
agent_players = models.ManyToManyField(
    AgentPlayer, related_name="accounts")
clubs = models.ManyToManyField(
    Club, through='AccountClub', related_name='accounts')

def __str__(self):
    return f"{self.nickname} ({self.club_account_id})"

class AccountClub(models.Model):
    account = models.ForeignKey(
        Account, on_delete=models.CASCADE, related_name='club_deal')
    club = models.ForeignKey(
        Club, on_delete=models.CASCADE, related_name='account_deal')
    rakeback_percentage = models.DecimalField(
        max_digits=3, decimal_places=3, validators=[MinValueValidator(Decimal('0.01'))])
    chip_value = models.DecimalField(max_digits=3, decimal_places=2, validators=[
                                     MinValueValidator(Decimal('0.01'))])

    def __str__(self):
        return f"{self.account.nickname} belongs to {self.club.name} with rakeback of {self.rakeback_percentage} and chip value of {self.chip_value}"

序列化器:

class AgentPlayerSerializer(serializers.ModelSerializer):

class Meta:
    model = AgentPlayer
    fields = "__all__"


class ClubSerializer(serializers.ModelSerializer):
    agent_players = AgentPlayerSerializer(many=True)

    class Meta:
        model = Club
        fields = '__all__'


class AccountSerializer(serializers.ModelSerializer):
    agent_players = AgentPlayerSerializer(many=True)
    clubs = ClubSerializer(many=True)

class Meta:
    model = Account
    fields = [
        'nickname',
        'club_account_id',
        'agent_players',
        'clubs',
    ]

def create(self, validated_data):
    rakeback_percentage = validated_data.pop('rakeback_percentage')
    chip_value = validated_data.pop('chip_value')
    club = validated_data.club
    account = Account.objects.create(**validated_data)
    account.account_club.rakeback_percentage = rakeback_percentage
    account.account_club.chip_value = chip_value
    AccountClub.create(account=account, club=club,
                       rakeback_percentage=rakeback_percentage, chip_value=chip_value)
    return account

views.py:

def create_account(request):
data = FormParser().parse(request)
serializer = AccountSerializer(data=data)
if serializer.is_valid():
    serializer.save()
    next = request.POST.get('next', '/')
    return HttpResponseRedirect(next, status=201)
return JsonResponse(serializer.errors, status=400)
django many-to-many serializer
1个回答
0
投票

您在clubs模型上的Account字段不是blank=True,因此如果没有至少一个球杆,就无法创建account。所以你不能做

account = Account.objects.create(**validated_data)

然后做

AccountClub.create(account=account, club=club, rakeback_percentage=rakeback_percentage, chip_value=chip_value)

您可以将Account型号代码更改为:

clubs = models.ManyToManyField(Club, through='AccountClub', blank=True, related_name='accounts')

也请检出这些链接:

© www.soinside.com 2019 - 2024. All rights reserved.