2016-04-11 2 views
0

Я использую структуру Django REST.django rest framework, non pk вложенные сериализаторы

У меня есть несколько моделей, которые выглядят так:

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") 

, чтобы получить данные по каждой записи пользователя с номером студента я использую этот вид (переопределяет 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) 

и это сериализатору

class UserDetailSerializer(serializers.HyperlinkedModelSerializer): 

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

что все работает нормально. Однако я хотел бы связать сериализаторы, чтобы показать все события в модели событий для записей указанного пользователя. Однако, как я понимаю (и я вполне мог бы получил это неправильно), просто добавив в сериализатор:

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') 

Это не будет работать, как события сериализатор будет пытаться соответствовать его звукозаписывающему в PKs против student_number, что не сопоставимо.

Есть ли способ заставить EventSerializer искать события для пользователей, использующих пользователей pk (userfieldid) вместо этого?

Надеюсь, я объяснил это хорошо. Это все очень сбивает с толку, потому что для меня все ново.

+0

Название вопроса предполагает, что этот вопрос касается сравнения дат, но вы не указываете даты нигде в самом вопросе? Я бы рекомендовал обновить заголовок, чтобы лучше описать вашу проблему. –

+0

о, дорогая. Я удалил старый вопрос, но забыл изменить название! – user1412705

ответ

0

Я не думаю, что проблема будет. Внешний ключ в событиях ссылается на первичный ключ пользователя. Вы можете фильтровать любой столбец, который вам нравится, например номер студента, но он будет использоваться только для фильтрации возвращаемых пользователей. Для каждого пользователя вложенный сериализатор возвращает события с основным ключом этого пользователя в поле пользователя.

Смежные вопросы