Как фильтровать модели Django для получения значений полей из разных таблиц
Я работаю над приложением Django Ticketing Application, где у меня есть представление проверки статуса пин-кода. И я хочу запросить модель Pin, чтобы узнать, активирован ли PIN, и если активирован, запросить модели Guest и Profile, чтобы получить информацию о госте и отобразить ее в шаблоне.
Я смог использовать Django Forms с поиском для отображения данных PIN, но НЕ смог понять логический код для получения профиля гостя, если PIN АКТИВИРОВАН. Возможно, кто-то захочет помочь. спасибо.
Код модели:
class Profile(models.Model):
user = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
surname = models.CharField(max_length=20, null=True)
othernames = models.CharField(max_length=40, null=True)
gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
phone = PhoneNumberField()
image = models.ImageField(default='avatar.jpg', blank=False, null=False, upload_to ='profile_images',
)
#Method to save Image
def save(self, *args, **kwargs):
super().save(*args, **kwargs)
img = Image.open(self.image.path)
#Check for Image Height and Width then resize it then save
if img.height > 200 or img.width > 150:
output_size = (150, 250)
img.thumbnail(output_size)
img.save(self.image.path)
def __str__(self):
return f'{self.user.username}-Profile'
class Pin(models.Model):
ticket = models.ForeignKey(Ticket, on_delete=models.CASCADE)
value = models.CharField(max_length=6, default=generate_pin, blank=True)
added = models.DateTimeField(auto_now_add=True, blank=False)
reference = models.UUIDField(primary_key = True, editable = False, default=uuid.uuid4)
status = models.CharField(max_length=30, default='Not Activated')
#Save Reference Number
def save(self, *args, **kwargs):
self.reference == str(uuid.uuid4())
super().save(*args, **kwargs)
def __unicode__(self):
return self.ticket
class Meta:
unique_together = ["ticket", "value"]
def __str__(self):
return f"{self.ticket}"
def get_absolute_url(self):
return reverse("pin-detail", args=[str(self.id)])
class Guest(models.Model):
guest_name = models.CharField(max_length=30, null=True)
pin = models.CharField(max_length=6, null=True)
def __str__(self):
return f"{self.guest_name}"
Мои взгляды:
def Pin_Searcht(request):
context = {}
#Search PIN Form
searchForm = SearchEventTicketForm(request.GET or None)
if searchForm.is_valid():
#Value of search form
value = searchForm.cleaned_data['value']
user_pin = Pin.objects.filter(value=value)
else:
user_pin = Pin.objects.order_by('-added')[:2]
page_title = "Search and Print PINs"
context.update ({
'page_title':page_title,
'list_pins':paged_listPin,
'searchForm':searchForm,
'page_title':"PIN Status",
})
return render(request, 'user/pin_list.html', context)
Я не вижу никакой связи между Pin Model и Profile Models, я вижу ее в Guests
- Guest.pin == Pin.value
Если вы хотите, чтобы поиск возвращал несколько пинов + несколько гостей
# This is a Queryset (list of Pins)
# [ <Pin #1> ]
user_pin_list = Pin.objects.filter(value=value)
# Get Guests with Pins (list)
# [ <Guest #1> ]
guest_list Guest.objects.filter(pin__in=user_pin_list)
Если вы хотите, чтобы поиск возвращал один пин + один гость
# Get Pin (Single)
# <Pin #1>
user_pin_or_none = Pin.objects.filter(value=value).first()
# Get Guest with Pin (Single)
# <Guest #1>
guest_or_none = Guest.objects.filter(pin=user_pin).first()
Вы также можете просто добавить ForignKey к Pin в каждом госте + модели таблицы:
class Pin(models.Model):
value = models.CharField(max_length=6, default=generate_pin, blank=True)
class Profile(models.Model):
# other fields
pin = models.ForeignKey(Pin, on_delete=models.CASCADE)
class Guest(models.Model):
# other fields
pin = models.ForeignKey(Pin, on_delete=models.CASCADE)
и затем используйте:
user_pin_or_none = Pin.objects.filter(value=value).first()
guest_or_none = Guest.objects.filter(pin=user_pin_or_none).first()
profile_or_none = Profile.objects.filter(pin=user_pin_or_none).first()
# -------------------------
# or you could do this: `__` allows you to filter fields in a ForeignKey (useful!)
guest_or_none = Guest.objects.filter(pin__value=value).first()
profile_or_none = Profile.objects.filter(pin__value=value).first()