Получить поля из сквозной таблицы в Django - PullRequest
0 голосов
/ 20 февраля 2020

У меня есть две модели, organization и vendor, которые связаны между собой "реляционной" или "сквозной" таблицей, VendorOrganization. В моей сквозной таблице есть поле description, к которому я пытаюсь получить доступ, но не знаю. Как мне настроить мой просмотр, запрос и сериализатор, чтобы иметь возможность доступа к полям из сквозной таблицы? Спасибо за любую помощь!

// models.py

class Organization(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=20, unique=True, validators=[alphanumeric_plus_underscore, MinLengthValidator(4)])
    vendors = models.ManyToManyField("thirdparty.Vendor", through="thirdparty.VendorOrganization")

class Vendor(models.Model):
    id = models.AutoField(primary_key=True)
    name = models.CharField(max_length=60, blank=False, null=False)

class VendorOrganization(models.Model):
    vendor = models.ForeignKey(Vendor, blank=False, null=False, on_delete=models.CASCADE)
    organization = models.ForeignKey(Organization, blank=True, null=False, on_delete=models.DO_NOTHING)
    created_at = models.DateTimeField(_('created at'), auto_now_add=True, null=True)
    created_by_user = models.ForeignKey(User, blank=False, null=False, on_delete=models.DO_NOTHING)
    description = models.CharField(max_length=300, blank=True, null=False)

// serializers.py (это не работает, чтобы получить поле 'description')

class VendorSerializer(serializers.ModelSerializer):

class Meta:
    model = Vendor
    fields = ('id', 'name', 'created_at', 'created_by_user', 'description')
    extra_kwargs = {
        'id': {'read_only': True},
        'created_at': {'read_only': True},
    }

// views.py

class VendorView(mixins.DestroyModelMixin, ListAPIView):
    authentication_classes = (TokenAuthentication,)

    def get(self, request):

        pagination_class = None
        current_org = Organization.objects.get(id=request.user.organization.id)
        queryset = current_org.vendors.select_related()
        vendors = VendorSerializer(queryset, many=True)
        return Response(vendors.data)

Ответы [ 2 ]

2 голосов
/ 20 февраля 2020

Вы можете передать ваш organization_id с контекстом вашему сериализатору, а в сериализаторе использовать SerializerMethodField (). Например,

в вашем views.py:

class VendorView(mixins.DestroyModelMixin, ListAPIView):
    #your other codes

     #add this method for pass data to your serializer
     def get_serializer_context(self):
         return {'organization_id': request.user.organization.id}

в вашем файле serializers.py

class VendorSerializer(serializers.ModelSerializer):
    description = serializers.SerializerMethodField()

    class Meta:
        model = Vendor
        fields = ('id', 'name', 'created_at', 'created_by_user', 'description')
        extra_kwargs = {
        'id': {'read_only': True},
        'created_at': {'read_only': True},
    }

    def get_description(self,obj):
        organization = Organization.objects.get(id=self.context['organization_id'])
        return obj.vendororganization_set.filter(organization=organization).first().description()
    #NOTE: You can have multiple vendororganization, so you must set a logic in here.Perhaps you can change your vendor model with OneToOneFieldAnd you must check whether your vendor organziation exists.
0 голосов
/ 20 февраля 2020

В serializer.py измените модель с Vendor на VendorOrganization. Потому что вы ссылаетесь как через эту модель

...