如何在Django中获取字段名而不是外来id

2024-05-08 19:27:13 发布

您现在位置:Python中文网/ 问答频道 /正文

在我的django应用程序中,我有四个使用外键链接的模型表,问题是,当我对任何模型表进行查询时,通过外键链接的字段将作为id而不是名称返回

我的方法行不通

我的客户型号.py文件

第一款

class Customer(models.Model):
    name = models.CharField(max_length=50)
    phone = models.CharField(max_length=20, unique=True)
    email = models.EmailField(max_length=255, unique=True, blank=True)
    image = models.ImageField(default='default.png', upload_to='customer_photos/%Y/%m/%d/')
    data_added = models.DateField(default=datetime.now, blank=True)

    def __str__(self):
        return self.name

第二款车型

class ShippingAddress(models.Model):
    customer = models.ForeignKey(Customer, on_delete=models.CASCADE, related_name="customer_ship_address")
    description = models.TextField(blank=True)   
    frequent_customer = models.BooleanField(default=False)
    address = models.CharField(max_length=50, blank=True)
    zip_code = models.CharField(max_length=12, blank=True)
    location = models.CharField(max_length=255)

    def __str__(self):
        return self.customer.name

第三款-付款发票

class paymentInvoice(models.Model):

    shipping_address_owner = models.ForeignKey(
        ShippingAddress, on_delete=models.CASCADE, related_name="customer_invoice")
    product = models.ManyToManyField(
        Product, related_name='product_invoice')
    mode = models.CharField(max_length=20, choices=paymentMode.choices, default=paymentMode.MPESA)
    date = models.DateField(default=datetime.now)
    invoice_id = models.CharField(
        max_length=50, unique=True, default=increment_invoice_number)
    quantity = models.PositiveSmallIntegerField()
    status = models.CharField(
        max_length=20, choices=paymentStatus.choices, default=paymentStatus.PENDING)
    payment_made = models.DecimalField(max_digits=20, decimal_places=2)

    def __str__(self):
        return self.shipping_address_owner.customer.name

我的产品型号.py文件

class Product(models.Model):
    slug = models.CharField(max_length=200, unique=True)
    name = models.CharField(max_length=200)
    available = models.BooleanField(default=True)
    description = models.TextField(blank=True)
    image = models.ImageField(default='default_product.jpg', upload_to='product_photos')
    category = models.CharField(max_length=200)
    qty_amount = models.CharField(
        max_length=20, choices=Qty_Choices, default='250ml')
    price = models.DecimalField(max_digits=10, decimal_places=2)

    def __str__(self):
        return self.name

我的付款发票视图.py文件

class paymentInvoiceListCreateView(ListCreateAPIView):
    """
    ListCreateAPIView executes both 'GET' and 'POST' requests. i.e listing a queryset or creating a model instance.
    """
    serializer_class = paymentInvoiceSerializer
    queryset = paymentInvoice.objects.all().order_by(
        '-date').values(shipping_address_owner__customer)

当我进行上述查询时,api返回以下内容,其中product字段和shipping\u address\u owner字段只是id。我需要有各自的名字

{
    "count": 6,
    "next": null,
    "previous": null,
    "results": [
        {
            "id": 9,
            "mode": "Mpesa",
            "date": "2020-07-27",
            "invoice_id": "INV-0006",
            "quantity": 1,
            "status": "Pending",
            "payment_made": "500.00",
            "shipping_address_owner": 9,
            "product": [
                1
            ]
        },

编辑:paymentInvoiceSerializer

class paymentInvoiceSerializer(serializers.ModelSerializer):
    class Meta:
        model = paymentInvoice
        fields = '__all__'

Tags: nameselfidtruedefaultaddressmodelscustomer
2条回答

您需要对序列化程序进行一些更改

如果您只需要名称,仅此而已:

class paymentInvoiceSerializer(serializers.ModelSerializer):
    product = serializers.SerializerMethodField()
    shipping_address_owner = serializers.SerializerMethodField()

    class Meta:
        model = paymentInvoice
        fields = '__all__'
    
    def get_product(self, instance):
        names = []
        for product in instance.product.all():
            names.append(product.name)
        return names
    
    def get_shipping_address_owner(self, instance):
        return instance.shipping_address_owner.customer.name

您还可以为每个模型创建不同的序列化程序,并将它们传递到它们的字段,以获取它们的完整序列化数据。应该是这样的:

ProductSerializer(serializers.ModelSerializer):
    class Meta:
        model = Product
        fields = '__all__'

然后在您的付款序列化程序中:

class paymentInvoiceSerializer(serializers.ModelSerializer):
    product = ProductSerializer()

    class Meta:
        model = paymentInvoice
        fields = '__all__'

您可以对shipping_address_owner执行相同的操作

您可以在序列化程序中这样尝试

class paymentInvoiceSerializer(serializers.ModelSerializer):
    shipping_address_owner = serializers.CharField(source='shipping_address_owner.customer')
    class Meta:
        model = paymentInvoice
        fields = ['shipping_address_owner',...]

相关问题 更多 >