Blu*_*Dog 0 django filter models
在Django中是否可以使用request.GET的模型方法?例如
class Car(models.Model):
owner = ForeignKey(Owner)
car_model = ...
def car_filter(self, request):
query = request.GET.get("q")
if query:
Car.objects.filter(owner = self.id.order_by('id')
else:
Car.objects.filter(owner = me).order_by('id'
)
Run Code Online (Sandbox Code Playgroud)
?
从技术上讲,当然,您可以 - 只要您可以从视图中传递请求对象.您发布的示例代码在语法上是不正确的,但是,这样的技术可行.您只需确保该方法是类方法,而不是实例方法(因为在这种情况下您没有任何实例):
class Car(models.Model):
...
@classmethod
def get_by_owner(cls, request):
query = request.GET.get("q")
if query:
return cls.objects.filter(owner=query)
elif request.user.is_authenticated():
return cls.objects.all()
def your_view(request):
cars = Car.get_by_owner(request)
...
Run Code Online (Sandbox Code Playgroud)
但是,不要这样做.这是一个坏主意,因为您正在将请求处理逻辑移动到模型中.模型应该只关心数据,而用户请求处理是视图的工作.
所以,我建议在视图中包含所有逻辑:
def your_view(request):
cars = Car.objects.all().order_by("id")
query = request.GET.get("q")
if query:
cars = cars.filter(owner=query)
...
Run Code Online (Sandbox Code Playgroud)
如果您需要一些复杂的逻辑,许多视图将共享,您可以使用模型管理器:
class CarManager(model.Manager):
def owned(self, username=None):
queryset = super(CarManager, self).get_query_set()
if username:
user = Owner.objects.get(username=username)
queryset = queryset.filter(owner=user)
return queryset
class Car(models.Model):
...
objects = CarManager()
...
def your_view(request):
query = request.GET.get("q")
cars = Car.objects.owned(query)
...
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6521 次 |
| 最近记录: |