我目前有一個使用ModelViewSet的SiteViewSet,它可以從模型Site列出、檢索、創建和更新站點。
我想在同一個SiteViewSet中添加一個過濾器,列出所有is_active為True的站點物件 - 但是這個條件是基于AdminConfiguration模型。
我無法找到如何在ModelViewSet中基于另一個模型的條件來實作一個過濾器。被過濾的端點/v1/site/?is_active=True是否可以在同一個SiteViewSet中實作,或者我應該創建一個單獨的視圖來通過更靈活的APIView實作?
SiteViewSet:
class SiteViewSet(viewsets.ModelViewSet)。
model = Site
lookup_field = 'uuid'/span>
pagination_class = PageNumberPagination
serializer_class = SiteSerializer
queryset = Site.objects.all()
Site 模型:
class Site(models.Model)。
uuid = models.UUIDField(
default=uuid.uuid4,
unique=True)
domain_name = models.CharField(max_length=255, unique=True)
AdminConfiguration模型:
class AdminConfiguration(models.Model)。
site = models.OneToOneField(
網站。
on_delete=models.CASCADE)
always_active = models.BooleanField(default=False)
subscription_ends = models.DateTimeField(
默認=set_default_expiration)
@property
def is_active(self)。
active_status = self.always_active or self.subscription_ends > timezone.now()
return active_status
uj5u.com熱心網友回復:
在DRF中,基于另一個模型的過濾器和針對一個模型欄位的過濾器是一樣的。你可以通過覆寫get_queryset方法來實作這一點:
。我們假設你已經宣告了你的OneToOneField,如:。
site = models.OneToOneField(Site, on_delete=models.CASCADE, related_name='admin_config').
def get_queryset(self)。
queryset = Site.objects.filter(admin_config__is_active=True)
.filter(related_model_name__field=value)
NB :你的is_active欄位是一個屬性! 所以我從來沒有用模型的@property欄位測驗過。但它在標準欄位中作業正常。
如果你覆寫了get_queryset方法,也別忘了洗掉queryset屬性。其中一個,而不是兩個。
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/332358.html
標籤:
