我有一个简单的模型,其中User
可以参与多个Game
和Game
可以由多个User
播放。每个User
在Game
中都有一个score
字段。使用Django REST序列化与单个额外字段的多对多关系
为了实现这一点,我按照Django文档中提供了一种通过创建第三模型Membership
连结的Game
表和User
一个来实现与一个附加的字段这种ManyToMany
关系的例子。
我有以下models.py
:
from django.contrib.auth.models import AbstractUser
from django.db.models.signals import post_save
from django.dispatch import receiver
from rest_framework.authtoken.models import Token
from django.db import models
class User(AbstractUser):
pass
# triggered as soon as a new user is saved in the db
@receiver(post_save, sender=User)
def create_auth_token(sender, instance=None, created=False, **kwargs):
if created:
Token.objects.create(user=instance)
class Game(models.Model):
users = models.ManyToManyField(User, through='Membership')
class Membership(models.Model):
user = models.ForeignKey(User, on_delete=models.CASCADE)
game = models.ForeignKey(Game, on_delete=models.CASCADE)
score = models.IntegerField()
然后我写了serializers.py
:
from rest_framework import serializers
from .models import User, Membership, Game
class UserSerializer(serializers.ModelSerializer):
class Meta:
model = User
# unique email
model._meta.get_field('email').__dict__['_unique'] = True
fields = ('id', 'username', 'password', 'email')
def create(self, validated_data):
user = super().create(validated_data)
if 'password' in validated_data:
user.set_password(validated_data['password'])
user.save()
return user
class GameSerializer(serializers.ModelSerializer):
users = UserSerializer(many=True)
class Meta:
model = Game
fields = ('users',)
class MembershipSerializer(serializers.HyperlinkedModelSerializer):
id = serializers.ReadOnlyField(source='game.id')
class Meta:
model = Membership
fields = ('id', 'score')
我的目标是能够通过张贴像保存一个新的Game
:
{
{user_id = 1,
score = 25},
{user_id = 2,
score = 10}
}
我想知道如何达到t他的。