如何使用非非模型字段进行过滤?
How to filter with a non non-model field?
我有一个模型,其中一个字段是随机生成的字符串,如下所示
from django.utils.crypto import get_random_string
class Competition(models.Model):
name = models.CharField(verbose_name="challenge name", max_length=256)
start_date = models.DateTimeField(verbose_name="start date")
end_date = models.DateTimeField(verbose_name="end date")
code = get_random_string(length=6)
owner = models.ForeignKey(User, related_name="owner", on_delete=models.CASCADE)
def __str__(self):
return self.name
我正在尝试使用这样的端点http://192.168.1.2:8000/competitions/?code=${some_string}
从 React 前端进行访问。所以为了这样做我有一些过滤器
from django_filters import rest_framework as filters
class CompetitionFilter(filters.FilterSet):
class Meta:
model = competition
fields = {
"name": ["exact", "icontains"],
"code": ["exact"],
"start_date": ["exact", "lte", "gte"],
"end_date": ["exact", "lte", "gte"],
"owner": ["exact"],
}
但我有一个错误说 TypeError: 'Meta.fields' must not contain non-model field names: code
那么我该如何实现呢?
您可以将代码字段设为模型字段,并通过其默认值生成随机代码 属性:
from django.utils.crypto import get_random_string
def set_code():
return get_random_string(length=6)
class Competition(models.Model):
...
#we use set_code as a callable as per the Field.default docs
code = models.CharField(max_length=6, default=set_code)
....
一个警告:任何现有记录在迁移后都将具有相同的代码值,因此您需要循环浏览它们并通过 set_code() 进行重置。新记录应该没问题。
我有一个模型,其中一个字段是随机生成的字符串,如下所示
from django.utils.crypto import get_random_string
class Competition(models.Model):
name = models.CharField(verbose_name="challenge name", max_length=256)
start_date = models.DateTimeField(verbose_name="start date")
end_date = models.DateTimeField(verbose_name="end date")
code = get_random_string(length=6)
owner = models.ForeignKey(User, related_name="owner", on_delete=models.CASCADE)
def __str__(self):
return self.name
我正在尝试使用这样的端点http://192.168.1.2:8000/competitions/?code=${some_string}
从 React 前端进行访问。所以为了这样做我有一些过滤器
from django_filters import rest_framework as filters
class CompetitionFilter(filters.FilterSet):
class Meta:
model = competition
fields = {
"name": ["exact", "icontains"],
"code": ["exact"],
"start_date": ["exact", "lte", "gte"],
"end_date": ["exact", "lte", "gte"],
"owner": ["exact"],
}
但我有一个错误说 TypeError: 'Meta.fields' must not contain non-model field names: code
那么我该如何实现呢?
您可以将代码字段设为模型字段,并通过其默认值生成随机代码 属性:
from django.utils.crypto import get_random_string
def set_code():
return get_random_string(length=6)
class Competition(models.Model):
...
#we use set_code as a callable as per the Field.default docs
code = models.CharField(max_length=6, default=set_code)
....
一个警告:任何现有记录在迁移后都将具有相同的代码值,因此您需要循环浏览它们并通过 set_code() 进行重置。新记录应该没问题。