[英]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.