Получение сведений о поле для входа в систему в среде Django REST с отношением foreignkeyfield

#django #django-rest-framework

#django #django-rest-framework

Вопрос:

Я пытаюсь повысить ценность модели InstantInvestment в среде Django REST, которая работает. но я хочу показать только доставку, предназначенную специально для пользователя, вошедшего в систему. это означает, что в нынешней ситуации вся доставка предоставляется не для этого пользователя.

models.py

 class Shipping(models.Model):
    investor = models.ForeignKey(User, related_name='shipping', on_delete=models.CASCADE)
    beneficiary = models.CharField("Beneficiary Name", max_length=150)
    bank = models.ForeignKey(Bank, related_name="bank", on_delete=models.CASCADE)
    account = models.CharField(max_length=10) 
    address = models.TextField("Shipping Adresss")
    created_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return self.beneficiary

    class Meta:
        
        verbose_name = 'Shipping'
        verbose_name_plural = 'Shippings'


class InstantInvestment(models.Model):
   
    
    investor = models.ForeignKey(User, related_name='instantivestment', on_delete=models.CASCADE)
    ref_code = models.CharField(max_length=200, blank=True, null=True)
    investment = models.FloatField("Investment in dollar")
    rate = models.FloatField("Exchange Rate")
    transferable = models.FloatField("Money Transferable")
    conversion = models.FloatField("Rate in Naira")
    product = models.ForeignKey(Product, related_name='instant_product', on_delete=models.CASCADE)
    shipping = models.ForeignKey(Shipping, related_name='shipping', on_delete=models.CASCADE)
    done = models.BooleanField("Completed Transaction", default=False)
    created_at = models.DateTimeField(auto_now_add=True)
    update_at = models.DateTimeField(auto_now=True)

    def __str__(self):
        return f'{self.investor.get_full_name()} - Transaction Code: {self.ref_code}'

    class Meta:
        verbose_name = 'InstantInvestment'
        verbose_name_plural = 'InstantInvestments'
  

serializers.py

 class ShippingSerializer(serializers.ModelSerializer):

    
    class Meta:
        model = Shipping
        fields = ('beneficiary', 'bank', 'account', 'address') 



class QucikPaymentSerializer(serializers.ModelSerializer):

    

    class Meta:
        model = InstantInvestment
        fields = ('url', 'id','investment', 'rate', 'transferable', 'conversion', 'product', 'shipping')
  

views.py

 class QuickPaymentView(viewsets.ModelViewSet):
    queryset = InstantInvestment.objects.all()
    serializer_class = QucikPaymentSerializer

    permission_classes = [ permissions.IsAuthenticated ]
    

    def get_queryset(self):
        return InstantInvestment.objects.filter(investor=self.request.user, done=False) 

    def perform_create(self, serializer):
        serializer.save(investor=self.request.user)
  

введите описание изображения здесь

Комментарии:

1. Вы пробовали добавлять shipping__investor=self.request.user в свой ModelViewSet?

2. какова связь между инвестором InstantInvestment и инвестором в доставку?

3. доставка = модели. ForeignKey(доставка, related_name=’доставка’, on_delete=модели. КАСКАД)

4. как мне это разместить — shipping__investor=self.request.user

5. В вашем def get_queryset(self):

Ответ №1:

Удалите атрибут набора запросов в вашем классе viewset

 class QuickPaymentView(viewsets.ModelViewSet):
    serializer_class = QucikPaymentSerializer
    permission_classes = [ permissions.IsAuthenticated ]
    

    def get_queryset(self):
        return InstantInvestment.objects.filter(investor=self.request.user, done=False) 

    def perform_create(self, serializer):
        serializer.save(investor=self.request.user)
  

чтобы это работало, вам необходимо указать аргумент ключевого слова basename при регистрации вашего класса viewset в router.

 router.register(r'quickpayment/' , QuickPaymentView , basename='InstantInvestment')
  

Комментарии:

1. У меня нет проблем с этим. При создании нового quickPaymentView мне нужна доставка, принадлежащая текущему пользователю. Текущая ситуация сейчас показывает всю доставку в базе данных

2. Вы упоминаете HTML-форму, в которой вы показали вопрос?

3. ДА… Мне нужна доставка, чтобы показать единственный ввод от пользователя

Ответ №2:

Если вы хотите сделать это, вам нужно написать html отдельно. Я думаю, что вы показали в своем вопросе интерфейс rest framework для тестирования api. Этот пользовательский интерфейс не может определить пользователя до отправки запроса.