簡體   English   中英

如何過濾 Django 模型以從不同的表中獲取字段值

[英]How Can I filter Django Models To Get Field Values From Different Tables

我正在開發 Django 票務應用程序,其中我有一個引腳狀態檢查視圖。 我想查詢 Pin Model 以了解該 PIN 是否已激活,如果激活則查詢訪客和 Profile Models 以獲取訪客資料信息並顯示在模板中。

我已經能夠使用 Django Forms 進行搜索以顯示 PIN 詳細信息,但如果 PIN 已激活,則無法找出獲取訪客配置文件的邏輯代碼。 有人可能希望提供幫助。 謝謝。

型號代碼:

class Profile(models.Model):
    user = models.OneToOneField(User, on_delete=models.CASCADE, null = True)
    surname = models.CharField(max_length=20, null=True)
    othernames = models.CharField(max_length=40, null=True)
    gender = models.CharField(max_length=6, choices=GENDER, blank=True, null=True)
    phone = PhoneNumberField()
    image = models.ImageField(default='avatar.jpg', blank=False, null=False, upload_to ='profile_images', 
)


    #Method to save Image
    def save(self, *args, **kwargs):
        super().save(*args, **kwargs)
        img = Image.open(self.image.path)
        #Check for Image Height and Width then resize it then save
        if img.height > 200 or img.width > 150:
            output_size = (150, 250)
            img.thumbnail(output_size)
            img.save(self.image.path)

       def __str__(self):
           return f'{self.user.username}-Profile'

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.CharField(max_length=30, null=True)
    pin = models.CharField(max_length=6, null=True)


    def __str__(self):
        return f"{self.guest_name}" 

我的觀點:

def Pin_Searcht(request):
    context = {}
    #Search PIN Form
    searchForm = SearchEventTicketForm(request.GET or None)


    if searchForm.is_valid():
        #Value of search form
        value = searchForm.cleaned_data['value']
  

        user_pin = Pin.objects.filter(value=value)
    
      
    else:
        user_pin = Pin.objects.order_by('-added')[:2]
      
    page_title = "Search and Print PINs"
    context.update ({
    'page_title':page_title,
    'list_pins':paged_listPin,
    'searchForm':searchForm,
    'page_title':"PIN Status",

    })
    return render(request, 'user/pin_list.html', context)

我看不到引腳 Model 和配置文件模型之間有任何關系,我確實在客人中看到了

  • Guest.pin == Pin.value

如果您希望搜索返回多個 Pin 圖 + 多個客人

# This is a Queryset (list of Pins)
#   [ <Pin #1> ]
user_pin_list = Pin.objects.filter(value=value)

# Get Guests with Pins (list)
#   [ <Guest #1> ]
guest_list Guest.objects.filter(pin__in=user_pin_list)

如果您希望搜索返回單個 Pin + 單個訪客

# Get Pin (Single)
#   <Pin #1>
user_pin_or_none = Pin.objects.filter(value=value).first()

# Get Guest with Pin (Single)
#   <Guest #1>
guest_or_none = Guest.objects.filter(pin=user_pin).first()

您也可以在每個 Guest + Table 模型中添加一個 ForignKey 到 Pin:
class Pin(models.Model):
    value = models.CharField(max_length=6, default=generate_pin, blank=True)


class Profile(models.Model):
    # other fields
    pin = models.ForeignKey(Pin, on_delete=models.CASCADE)

class Guest(models.Model):
    # other fields
    pin = models.ForeignKey(Pin, on_delete=models.CASCADE)
然后使用:
user_pin_or_none = Pin.objects.filter(value=value).first()

guest_or_none = Guest.objects.filter(pin=user_pin_or_none).first()
profile_or_none = Profile.objects.filter(pin=user_pin_or_none).first()

# -------------------------
# or you could do this: `__` allows you to filter fields in a ForeignKey (useful!)
guest_or_none = Guest.objects.filter(pin__value=value).first()
profile_or_none = Profile.objects.filter(pin__value=value).first()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM