Конечная точка Django-Rest-Framework не имеет доступа к моей коллекции баз данных - PullRequest
1 голос
/ 11 июля 2019

Я пытаюсь создать конечную точку API для моего проекта django.В этом проекте у меня есть две базы данных: база данных SQLite и база данных MongoDB;данные, которые я пытаюсь получить, находятся в моей базе данных Mongo, в коллекции под названием tst.

Так что в этой коллекции уже есть некоторые данные.Я создал конечную точку, затем открыл браузер, чтобы перейти к http://127.0.0.1:8000/tst/, ожидая найти там эти данные в формате json, но похоже, что конечная точка не видит никаких данных, хотя я уверен, что это так.

Может кто-нибудь помочь мне понять, что я делаю не так?

Вот моя модель:

class tst(models.Model):
    id = models.CharField(max_length=100)
    ticker = models.FloatField()

    def save(self): # ALL the signature

        super(tst, self).save(using='dbtwo')

Вот мой взгляд:

class tstList(generics.ListCreateAPIView):
    queryset = tst.objects.using('dbtwo').all()
    serializer_class = tstSerializer

Вот сериализатор:

class tstSerializer(serializers.ModelSerializer):

    class Meta:
        model = tst
        fields = ('id', 'ticker', )

И URL:

path('tst/', views.tstList.as_view()),

Я получил эти две ошибки на своей консоли:

TypeError: Got a `TypeError` when calling `tst.objects.create()`. This may be because you have a writable field on the serializer class that is not a valid argument to `tst.objects.create()`. You may need to make the field read-only, or override the tstSerializer.create() method to handle this correctly.

И

TypeError: save() got an unexpected keyword argument 'force_insert'

Ответы [ 2 ]

1 голос
/ 11 июля 2019

Кажется, вас беспокоит только аргумент ключевого слова using в переопределенном методе save;вы можете использовать подстановочные аргументы для других, например:

class tst(models.Model):
    id = models.CharField(max_length=100)
    ticker = models.FloatField()

    def save(self, *args, using=None, **kwargs):
        super(tst, self).save(*args, using='dbtwo', **kwargs)

Это не означает, что вы должны указывать все другие не относящиеся к делу аргументы в сигнатуре метода.

1 голос
/ 11 июля 2019

Поскольку вы переопределяете метод save, вам нужно передать всю его сигнатуру, чтобы работать.Кроме того, вы должны переопределить ваш метод create в вашем сериализаторе.

class tst(models.Model):
    id = models.CharField(max_length=100)
    ticker = models.FloatField()

    def save(self, force_insert=False, force_update=False,
             using='dbtwo', update_fields=None):
        super(tst, self).save(force_insert=force_insert,
                              force_update=force_update,
                              using=using, update_fields=update_fields)
class tstSerializer(serializers.ModelSerializer):

    class Meta:
        model = tst
        fields = ('id', 'ticker', )

    def create(self, validated_data):
        return tst.objects.create(**validated_data)
...