Как получить значение столбца внешнего ключа в виде объекта?
Имеется 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)