Как определить модели в django, которые предоставляют пользовательские значения на основе предварительного выбора для поля?

Учитывая следующую модель, которая хранит список желаний пользователя для чтения книг:

class ReadingList(models.Model):
    user_id = models.ForeignKey(UserInfo, on_delete=models.DO_NOTHING, null=False, blank=False, default=None, db_column='user_id')
    book= models.CharField(max_length=255, blank=False)
    creation_time = models.DateTimeField(blank=True)

    class Meta:
        unique_together = (('user_id', book),)

Я хочу создать модель, помогающую отслеживать время, потраченное на чтение книги в разные дни, которая выглядит примерно так:

class ReadingTracker(models.Model):
    user_id = models.ForeignKey(ReadingList, on_delete=models.DO_NOTHING, related_name='user', blank=False, db_column='user_id')
    book= models.ForeignKey(ReadingList, on_delete=models.DO_NOTHING, related_name='book-to-read', blank=False, db_column='book')
    time = models.DateTimeField(blank=True)
    time_spent = models.floatfield()

На стороне клиента (соответствующей ReadingTracker) для обоих полей user_id и book. Я вижу, что перечислены ReadingList object (1), ReadingList object (2), .... Но это не работает так, как ожидалось. Я хочу добиться следующего:

  1. Для поля user_id я хочу видеть что-то вроде dummy_uid1, dummy_uid2, ..., чтобы быть перечисленным.

  2. Рассмотрим, что dummy_uid1 хочет прочитать книгу1 и книгу2, а dummy_uid2 хочет прочитать книгу1 и книгу3. Когда dummy_uid1 выбран как user_id, я хочу, чтобы только book1 и book2 были перечислены для выбора.

Как мне определить модель в django rest framework, чтобы достичь этого? Любые предложения, связанные с вышесказанным, будут очень признательны и заранее благодарны.

В этом вопросе есть две части:

  1. Если вы хотите видеть значение, отличное от ReadingList object (1), то вам нужно определить __str__ значение вашей модели, вы можете сделать это следующим образом:

    class ReadingList(models.Model):
       ...
    
       def __str__(self):
          return f'{self.user_id}' # return whatever string you want to display
    
  2. Если вы хотите просто отобразить книги для конкретного пользователя, то вы можете использовать filter() (см. документацию по Django):

    reading_list = ReadingList.objects.get(...)
    ReadingTracker.objects.filter(user_id=reading_list)
    

Однако я бы добавил, что у вас есть user_id на объекте ReadingList, который, похоже, связан с моделью User, но ваш user_id на ReadingTracker является ForeignKey отношением к ReadingList, что вносит путаницу. Я бы предложил переименовать поле или действительно сделать его связанным с моделью User (хотя в этом нет необходимости, поскольку вы все равно можете фильтровать по User через модель ReadingList).

Вернуться на верх