验证失败 - 字段是必需的。 ManyToMany序列化Django

Validation fail - field is required. ManyToMany serialization Django

我有要序列化的表单数据以创建两个对象,Account 和 AccountClub。 AccountClub 介于 Account 和 Club 之间 table,带有附加字段、返水和 chip_value。

我可以序列化表单数据,但是当我在保存前调用 is.valid() 函数时,我返回了一个错误,manytomany 字段为空

这是我的模型:

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)

你在 Account 模型上的 clubs 字段不是 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')

另请查看这些链接: