gpt4 book ai didi

djangorest框架limit_choices_to属性被忽略?

转载 作者:行者123 更新时间:2023-12-02 04:36:51 24 4
gpt4 key购买 nike

我使用 DjangoRest Framework 和 2 个模型 DeviceTypeChannel。现在,Channel 有一个指向DeviceType 的ForeignKeyField。到目前为止没有问题。但现在我不希望在添加或编辑 channel 时选择所有DeviceTypes,而是只选择具有usesChannels的DeviceTypes 字段设置为 True。所以我使用了 limit_Choices_to 属性,但不知何故这似乎不起作用。无论我做什么,我总是会得到一个包含所有 DeviceTypes 的列表,包括 usesChannels 设置为 False

的列表

这是我的代码:

models.py

class DeviceType(models.Model):
name = models.CharField(max_length=30)
usesChannels = models.BooleanField()

def __str__(self):
return '%s' % (self.name)

class Channel(models.Model):
type = models.ForeignKey(DeviceType, limit_choices_to={'usesChannels': True})
name = models.CharField(max_length=30)
channelNr = models.IntegerField()

序列化器.py

class DeviceTypeSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = DeviceType
fields = ('url', 'name', 'usesChannels')

class ChannelSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = Channel
flieds = ('url', 'type', 'name', 'channelNr')

我使用了This link中的ForeignKey.limit_choices_to示例

编辑:我使用 DRF 可浏览 API 来添加、编辑和删除数据。

答案:经过几天的努力,我找到了一个可行的解决方案:

models.py

class DeviceType(models.Model):
name = models.CharField(max_length=30)
usesChannels = models.BooleanField()

def __str__(self):
return '%s' % (self.name)

class Channel(models.Model):
type = models.ForeignKey(DeviceType)
name = models.CharField(max_length=30)
channelNr = models.IntegerField()

序列化器.py

class DeviceTypeSerializer(serializers.HyperlinkedModelSerializer):
class Meta:
model = DeviceType
fields = ('url', 'name', 'usesChannels')

class ChannelSerializer(serializers.HyperlinkedModelSerializer):
type = serializers.PrimaryKeyRelatedField(queryset=DeviceType.objects.filter(usesChannels=True))
class Meta:
model = Channel
flieds = ('url', 'type', 'name', 'channelNr')

编辑:为了完整起见,我也会添加 View

Views.py:

class DeviceTypeViewSet(viewsets.ModelViewSet):
queryset = DeviceType.objects.all()
serializer_class = DeviceTypeSerializer

class ChannelViewSet(viewsets.ModelViewSet):
queryset = Channel.objects.all()
serializer_class = ChannelSerializer

最佳答案

今天遇到这个问题。我相信它确实完全忽略了该属性;至少我在 DRF 的代码中找不到任何对它的引用。

所以我通过添加 Serializer.__init__ 构造函数并在其中添加以下函数/代码来“解决”问题:

class MySerializer(Serializers.Serializer):
def __init__(self, *args, **kwargs):
...
def limit_choices_to(field_name):
fld = self.fields[field_name]
fld.queryset = fld.queryset.filter(**Flight._meta.get_field(field_name).get_limit_choices_to())

limit_choices_to('my_field')

关于djangorest框架limit_choices_to属性被忽略?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39336668/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com