繁体   English   中英

如何查询具有 Foreign 和 OneToOneFields 的 Django 模型的字段值

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM