Django - problem z ForeignKey

0

Cześć. Tworzę właśnie swój pierwszy backend i nie mogę sobie poradzić z pozyskaniem attribute z innego modelu.

w GET dotyczącym class Transfer otrzymuje numer danego obiektu, a chciałbym otrzymywać wartość z atrybutu.
Czyli aktualnie otrzymuje w Postman:
location: 2
A chciałbym otrzymywać:
location: {{ wartość atrybutu location(CharField) z klasy Location }}.
ale tylko dla GET, ponieważ do POST oraz PUT będę wykorzystywać ID.

to samo tyczy się product, user
Z góry wielkie dzięki za dobre serce i wsparcie.

models.py:

class Product(models.Model):
    index = models.IntegerField(validators=[MinValueValidator(100), MaxValueValidator(999)], unique=True)
    name = models.CharField(max_length=64)
    ean = models.IntegerField(unique=True,)

class Location(models.Model):
    location = models.CharField(max_length=20, unique=True)

class Transfer (models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
    location = models.ForeignKey(Location, on_delete=models.CASCADE)
    pcs = models.IntegerField()
    user = models.ForeignKey(User, on_delete=models.CASCADE)
    last_transfer = models.DateField(auto_now=True)
    class Meta:
        unique_together = (('product', 'location'),)
        index_together = (('product', 'location'),)
0

Nie wstawiłeś kodu o który pytasz, nie da się Tobie pomóc chyba, że ktoś akurat zrozumie o co Ci chodzi (ja np. nie do końca łapię)

0

każda class ma przypisany url, A więc przykład z Postman:
POST (key: value):
produkt: 1
location: 1
pcs: 10
user: automamtycznie, na podstawie tokena
last_transfer też automatycznie
GET:
produkt: 1
location: 1
pcs: 10
user: automamtycznie, na podstawie tokena
last_transfer też automatycznie
a chciałbym, aby GET wyglądał:
produkt: Product.name
location: Location.location
pcs: 10
user: username
last_transfer: data (tutaj oczywiście działa wszystko ok)

Dodatkowo wysyłam views:


class UserViewSet(viewsets.ModelViewSet):
    queryset = User.objects.all()
    serializer_class = UserSerializer
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAdminUser, )

class ProductViewSet(viewsets.ModelViewSet):
    queryset = Product.objects.all()
    serializer_class = ProductSerializer
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated, )

class LocationViewSet(viewsets.ModelViewSet):
    queryset = Location.objects.all()
    serializer_class = LocationSerializer
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated, )

    @action(detail=True, methods=['POST'])
    def new_transfer(self, request, pk=None):
        if 'pcs' in request.data:
            location = Location.objects.get(id=pk)
            product = request.data['product']
            thisProduct = Product.objects.get(id=product)
            pcs = request.data['pcs']
            user = request.user

            try:
                transfer = Transfer.objects.get(location=location, product=thisProduct)
                transfer.pcs = pcs
                transfer.user = user
                transfer.save()
                response = {'message: ' 'transfer was updated'}
                return Response(response, status=status.HTTP_200_OK)
            except:
                Transfer.objects.create(product=thisProduct, location=location, pcs=pcs, user=user)
                response = {'message: ' 'transfer was created'}
                return Response(response, status=status.HTTP_200_OK)

        else:
            response = {'message: ' 'You need to provide PCS'}
            return Response(response, status=status.HTTP_400_BAD_REQUEST)

class TransferViewSet(viewsets.ModelViewSet):
    queryset = Transfer.objects.all()
    serializer_class = TransferSerializer
    authentication_classes = (TokenAuthentication, )
    permission_classes = (IsAuthenticated, )

    def update(self, request, *args, **kwargs):
        response = {'message: ' 'you cant update transfer like that'}
        return Response(response, status=status.HTTP_400_BAD_REQUEST)

    def create(self, request, *args, **kwargs):
        response = {'message: ' 'you cant create transfer like that'}
        return Response(response, status=status.HTTP_400_BAD_REQUEST)


0

Czyli w skrócie nie wiem totalnie jak pozyskać atrybut z modelu, który jest przypisany pod ForeignKey

0

Kojarzę tyle, że powinieneś nadpisać jakąś metodę w TransferSerializer. Tak z głowy nie powiem, którą dokładnie, ale tam powinieneś się rozglądać.

1

Musisz popracować nad przekazywaniem myśli i formatowaniem posta.

Dodatkowo nie wkleiłeś najważniejszej klasy, którą należy edytować (TransferSerializer)

Musisz dodać do niej

   location_name = serializers.SerializerMethodField('get_location_name')

    def get_location_name(self, obj):
        return obj.location.location

Coś w tym stylu. I to location_name oczywiście dodać na listę pól

0

Poprawne rozwiązanie problemu to dodanie do modelu funkcji:
no i oczywiście dodanie jej do fields

    def location_name(self):
        return self.location.location

1 użytkowników online, w tym zalogowanych: 0, gości: 1