[英]How Can I query Django Models with Foreign and OneToOneFields for Field Values
我的項目中有以下 Django 模型:Event、Ticket、Pin 和 Guest 那么如何查詢這些表以獲取登錄的來賓用戶已注冊的Event Name的名稱。 下面是我的代碼。 我的模型:
class Event(models.Model):
event_name = models.CharField(max_length=100)
date = models.DateField(auto_now_add=False, auto_now=False, null=False)
event_venue = models.CharField(max_length=200)
event_logo = models.ImageField(default='avatar.jpg', blank=False, null=False, upload_to ='profile_images')
added_date = models.DateTimeField(auto_now_add=True)
def __str__(self):
return f"{self.event_name}"
#Prepare the url path for the Model
def get_absolute_url(self):
return reverse("event_detail", args=[str(self.id)])
#Ticket Model
class Ticket(models.Model):
event = models.ForeignKey(Event, on_delete=models.CASCADE)
price = models.PositiveIntegerField()
category = models.CharField(max_length=100, choices=PASS, default=None, blank=True, null=True)
added_date = models.DateField(auto_now_add=True)
def __str__(self):
return f"{self.event} "
#Prepare the url path for the Model
def get_absolute_url(self):
return reverse("ticket-detail", args=[str(self.id)])
def generate_pin():
return ''.join(str(randint(0, 9)) for _ in range(6))
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.OneToOneField(User, on_delete=models.CASCADE, blank=True)
pin = models.CharField(max_length=6, default='No Pin', blank=True)
def __str__(self):
return f"{self.guest_name}"
我對如何進行此查詢感到非常困惑。 我已經嘗試過guest_event = Pin.objects.filter(guest__guest_name__icontains=request.user)
但沒辦法,因為我認為 that.get() 是出路但無法弄清楚,所以即使它也應該有人幫忙是為我重組數據庫以獲得解決方案。 謝謝
您沒有 FK 來將 guest 表與其他表連接,Guest 選項卡中的 pin 是 CharField,如果將其更改為 FK 字段,您可能可以根據您的表架構查詢它
感謝@Vaibh Vaibhav lodha,您的評論讓我知道了如何解決這個問題並且它奏效了。 以下是我如何重組我的客人 model:
class Guest(models.Model):
guest_name = models.OneToOneField(User, on_delete=models.CASCADE, blank=True)
ticket = models.OneToOneField(Ticket, on_delete=models.CASCADE, blank=True)
def __str__(self):
return f"{self.guest_name}"
並在視圖中我使用pin = request.session['pin']
將 PIN 值設置為 session 並在 register_guest 視圖中接收它pin = request.session.get('pin')
並從那里我能夠通過嘗試驗證 session 中的 PIN 值與 PIN model 中的 PIN 值,如下所示:
try:
pin_detail = Pin.objects.get(value = pin)
except Pin.DoesNotExist:
messages.error(request, 'PIN Does Not Exist')
return redirect('pin-activation')
else:
#Guest User Registration Form
form = GuestUserForm()
page_title = "Festival Registration"
if request.method == 'POST':
form = GuestUserForm(request.POST)
#Check if Form contains valid data
if form.is_valid():
#Save the Guest User Form to get an instance of the user
new_user = form.save()
#Create A New Guest with his PIN
Guest.objects.create(guest_name=new_user, ticket=pin_detail.ticket)
#Filter and update PIN
Pin.objects.filter(value=pin).update(status='Activated')
#Delete the PIN Session from the requet
del request.session['pin']
#Send User Message
messages.success(request, 'Registered Successfully. Login')
return redirect('user-login')
else:
form = GuestUserForm()
context = {
'form':form,
'page_title':page_title,
}
return render(request, 'user/register.html', context)
這就是我使用創建查詢將事件名稱保存在來賓 model 中的方式: Guest.objects.create(guest_name=new_user, ticket=pin_detail.ticket)
為了獲取事件名稱,我使用了pin_detail.ticket
,因為 pin_detail 得到了在查詢中使用.get()
方法,然后我還使用查詢中的 PIN 屬性(票證)來獲取與 PIN 關聯的事件票證。
為了獲得登錄來賓用戶事件,我在索引視圖中執行了以下操作:
try:
guest_user = Guest.objects.get(guest_name = request.user)
guest_event = guest_event.ticket
except Guest.DoesNotExist:
messages.error(request, 'Guest Does Not Exist')
return redirect('user-login')
else:
context = {
'guest_event':guest_event,
}
return render(request, 'user/profile.html', context)
如果我沒有使用最佳方法解決問題,我將得到糾正。 謝謝
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.