Как получить значение столбца внешнего ключа в виде объекта?

Имеется 2 модели Registration и RegistrationCompletedByUser, я хочу Registration кверисет из RegistrationCompletedByUser с filters(user=request.user, registration__in=some_value, is_completed=True) над RegistrationCompletedByUser. Следовательно, результат должен быть таким <QuerySet [<Registration: No name>, <Registration: p2>, <Registration: p-1>]>.

Теперь я попробовал следующее. Registration.objects.prefetch_related('registrationcompletedbyuser_set') но filters() не работает. Другой способ, который я пробовал, это модель Managers, но не передавать параметры для пользовательской фильтрации.

models.py

class Registration(models.Model):
  name=models.CharField(max_length=255)
  number=models.SmallIntegerField(null=True, blank=True)

class RegistrationCompletedByUser(models.Model):
  user = models.ForeignKey(User, on_delete=models.CASCADE)
  registration= models.ForeignKey(Registration, on_delete=models.CASCADE)
  points = models.SmallIntegerField(default=100)
  is_completed = models.BooleanField(default=False)

Как я понял, ваш вопрос связан с django. На самом деле существует общий способ получения связанного набора запросов от другого. Когда вы указываете ForeignKey для другой модели, django автоматически создает отношение 'Related Model' + '_set'.

Я не совсем понял из вашего вопроса, что вы хотите сделать. В вашей ситуации есть много RegistrationCompletedByUser, связанных с одной регистрацией. Поэтому, что вы можете сделать, это получить все экземпляры RegistrationCompletedByUser из экземпляра Registration по связанному имени для ForeignKey регистрации RegistrationCompletedByUser, который в вашем случае registration_set. На самом деле лучше указать в модели RegistrationCompletedByUser связанное имя как атрибут, как это сделано здесь:

   models.ForeignKey(Registration, on_delete=models.CASCADE, 
         related_name='registrations')

После этого, допустим, у вас есть экземпляр Registration reg1. Поэтому для получения набора запросов RegistrationCompletedByUser:

   reg1.registrations.all()

И вы можете использовать фильтр на нем с атрибутами из модели Registration. И если вы хотите получить регистрацию из RegistrationCompletedByUser, опять же в вашем случае это только одна регистрация ко многим RegistrationCompletedByUser, поэтому, допустим, у нас есть reg_completed_1, чтобы получить только одну регистрацию:

  reg = reg_completed_1.registration

Если я правильно понял, вы хотите получить все Registration, относящиеся к запросу, а не один объект.

qs_1 = RegistrationCompletedByUser.objects.filter(user=request.user, is_completed=True).values_list("registration__id", flat=True)

qs_2 = Registration.objects.filter(id__in=qs_1)
Вернуться на верх