简体   繁体   中英

django rest framework, non pk nested serializers

I'm using the Django REST framework.

I've got a couple of models that look like this:

class Users(models.Model):
    userfieldid = models.AutoField(db_column='FieldID', primary_key=True)  # Field name made lowercase.
    forename = models.CharField(db_column='Forename', max_length=50, blank=True, null=True)  # Field name made lowercase.
    surname = models.CharField(db_column='Surname', max_length=50, blank=True, null=True)  # Field name made lowercase.
    student_number = models.CharField(db_column='ExternalFieldID', max_length=255, blank=True, null=True)  # Field name made lowercase.

class Events(models.Model):
    eventfieldid = models.AutoField(db_column='FieldID', primary_key=True)  # Field name made lowercase.
    eventdescription =models.CharField(db_column='EventDescription', max_length=200, blank=True, null=True)  # Field name made lowercase.
    eventdate = models.DateTimeField(db_column='EventDate', blank=True, null=True)  # Field name made lowercase.
    user= models.ForeignKey(Users,db_column='UserFieldID',related_name="holder")

to get data on each user record with a student number i'm using this view (overriding the default queryset):

class UserDetail(generics.ListAPIView):

serializer_class = UserDetailSerializer

def get_queryset(self):
    student_number=self.kwargs['student_number']
    return Users.objects.using("lockers").filter(student_number=student_number)

and this serializer

class UserDetailSerializer(serializers.HyperlinkedModelSerializer):

    class Meta:
        model=Users
        fields=('student_number','forename','surname')

which is all working fine. However, I'd like to chain serializers in order to show all events in the events model for the specified user's records. However, as I understand it (and I could well have gotten this wrong), just adding this to the serializer:

class EventsSerializer(serializers.ModelSerializer):

    class Meta:
        model=Events

class UserDetailSerializer(serializers.HyperlinkedModelSerializer):
    events=EventsSerializer(many=True,read_only=True)

    class Meta:
        model=Users
        fields=('student_number','forename','surname','events')

This will not work as the events serializer will be trying to match it's record's PKs against the student_number , which will are not comparable.

Is there any way to get the EventsSerializer to look up events for the Users using the Users pk(userfieldid) instead?

I hope I've explained this okay. It's all very confusing as it's all new to me.

I don't think there will be an issue. The foreign key on events references the primary key of the user. You can filter by any column you like for example student number but it will only be used to filter what users are returned. For each user the nested serializer will return events with that user's primary key in the user field.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM