У меня есть "сквозная" модель, регулирующая отношения многих и многих, и я хочу иметь возможность возвращать "сквозную" модель и целевую модель в виде плоских данных, в отличие от размещения целевой модели.
Таким образом, используя стандартный пример для многих и многих с сквозными, скажем, это модели,
class Person(models.Model):
first_name = models.CharField(max_length=128)
last_name = models.CharField(max_length=128)
favourite_food = models.CharField(max_length=128)
class Group(models.Model):
name = models.CharField(max_length=128)
members = models.ManyToManyField(Person, through='Membership')
class Membership(models.Model):
person = models.ForeignKey(Person)
group = models.ForeignKey(Group)
date_joined = models.DateField()
invite_reason = models.CharField(max_length=64)
Итак, у сериализаторов, которые есть на данный момент, чтобы вернуть элементы членства,
class MembershipSerializer(serializers.HyperlinkedModelSerializer):
person = PersonSerializer()
class Meta:
model = Membership
fields = ('id', 'url', 'group', 'date_joined', 'invite_reason', 'person')
class PersonSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Person
fields = ('first_name', 'last_name', 'favourite_food')
Итак, когда я получаю модель членства с помощью MembershipSerializer, я получаю этот json,
{
'id':1,
'url':'http://cheeselovers.com/api/member/1/'
'group':'http://cheeselovers.com/api/group/1/'
'date_joined': '2014-01-24T16:33:40.781Z',
'invite_reason': 'loves cheese',
'person':{
'first_name':'Barry',
'last_name':'CheeseLover',
'favourite_food': 'cheese'
}
}
но я бы хотел вернуть это,
{
'id':1,
'url':'http://cheeselovers.com/api/member/1/'
'group':'http://cheeselovers.com/api/group/1/'
'date_joined': '2014-01-24T16:33:40.781Z',
'invite_reason': 'loves cheese',
'first_name':'Barry',
'last_name':'CheeseLover',
'favourite_food': 'cheese'
}
Теперь я понимаю, что я мог бы просто выполнить это, изменив для этого членство в Сериализаторе,
class MembershipSerializer(serializers.HyperlinkedModelSerializer):
first_name = serializers.Field(source='person.first_name')
last_name = serializers.Field(source='person.last_name')
favourite_food = serializers.Field(source='person.favourite_food')
class Meta:
model = Membership
fields = ('id', 'url', 'group', 'date_joined', 'invite_reason', 'first_name', 'last_name', 'favourite_food')
НО, целевая модель я имеет 10 свойств, а промежуточная 'сквозная' модель имеет только реквизиты только для чтения, поэтому у меня уже есть функционирующий сериализатор для целевой модели, который использовался при создании промежуточной модели.
Чуть более СУХОЙ, чтобы иметь возможность повторно использовать это, так что, если что-либо изменится на целевую модель, я должен внести изменения в это сериализатор, чтобы эти изменения отражались в данных, возвращаемых промежуточным сериализатором.
Итак, есть ли способ получить данные из PersonSerializer и добавить их в данные членства, чтобы он был плоским, а не вложенным?
... надеюсь, что все имеет смысл.