如何使用Foreign和OneToOneFields查询Django模型的字段值



我的项目中有以下Django模型:Event、Ticket、Pin和Guest,所以我如何查询这些表以获得登录的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),但没有办法,因为我认为.get((是解决办法,但无法解决,所以应该有人帮忙,即使是为我重组数据库以获得解决方案。感谢

您没有FK来连接来宾表和其他表,来宾选项卡中的pin是一个CharField,如果您将其更改为FK字段,则可以根据您的表模式进行查询

谢谢@Vaibh Vaibhav lodha,你的评论让我对如何解决这个问题有了一个想法,并且很有效。以下是我如何重组我的客户模型:

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值设置为会话,并在register_ guest视图pin = request.session.get('pin')中接收到它,从那里,我可以通过尝试验证会话中的PIN值,并将DoesNotExist排除在外,如下所示:

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)

这就是我使用创建查询将事件名称保存在来宾模型中的方式:Guest.objects.create(guest_name=new_user, ticket=pin_detail.ticket)为了获得事件名称,我使用了pin_detail.ticket,因为pin_detail在查询中使用了.get()方法,然后我还使用查询中的pin属性(ticket(来获得与pin相关联的事件ticket。

为了获得登录的访客用户事件,我在索引视图中做了以下操作:

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) 

如果我没有用最好的方法解决问题,我会被纠正的。感谢

最新更新