簡體   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