我有一個簡單的模型,其中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他的。