簡體   English   中英

Django Rest 框架:如何獲取相關外鍵的實例

[英]Django Rest Framework: How to get instance of related foreign key

注意:如果以下信息不清楚 - 請問我,我會更新並發布您需要的信息 | 對我來說很重要


Warehouse(models.Model)我有amount屬性和

ChosenProduct(models.Model) - quantity

我正在嘗試通過chosen_products中的 selected_products實例獲取Warehouse中的amount以添加App_formSerializer數量

但是我無法從instance中獲取chosen_products對象-> Out 下方:

class WarehouseSerializer(serializers.ModelSerializer):
    category_name = serializers.ReadOnlyField(
        source='category_product.category_name')
    posted_user = serializers.ReadOnlyField(
        source='posted_user.username')
    class Meta:
        model = Warehouse
        fields = ['id', 'category_product', 'category_name', 'condition',
                  'product_name', 'amount', 'barcode', 'f_price', 'created_at', 'updated_at', 'posted_user']

class ChosenProductSerializer(serializers.ModelSerializer):
    product_info = WarehouseSerializer(source='product', read_only=True)
    period_info = Product_periodSerializer(source='period', read_only=True)
    class Meta:
        model = ChosenProduct
        exclude = ('app_form',)

class App_formSerializer(serializers.ModelSerializer):
    chosen_products = ChosenProductSerializer(many=True)

    def update(self, instance, validated_data):
        instance.terminated = validated_data.get('terminated', instance.terminated)
        
        if instance.terminated == True :
              
            print('-----------TRUE--------------------')
            print(instance.chosen_products)
            print('-----------PRINT--------------------')

        instance.save()
        return instance

    class Meta:
        model = App_form
        fields = '__all__'

出去

-----------TRUE--------------------
creditapi.ChosenProduct.None
-----------PRINT--------------------

問題已更新


模型.py

    class Warehouse(models.Model):
        category_product = models.ForeignKey(
            Category_product, on_delete=models.CASCADE)
        product_name = models.CharField(max_length=200, unique=True)
        condition = models.BooleanField(default=False)
        amount = models.IntegerField()
        barcode = models.BigIntegerField()
        f_price = models.CharField(max_length=255, null=True)
        created_at = models.DateTimeField(auto_now_add=True)
        updated_at = models.DateTimeField(auto_now=True)
        posted_user = models.ForeignKey(User, on_delete=models.CASCADE, default=1)
    
        def __str__(self):
            return self.product_name
    
    class App_form(models.Model):
        phone_regex = RegexValidator(regex=r'^\+?1?\d{9,12}$', message="Phone number must be entered in the format: '998981234567'. Up to 12 digits allowed.")
        terminated = models.BooleanField(default=False)
        name = models.CharField(max_length=150)
        phone_number = models.CharField(validators=[phone_regex], max_length=13)
        
        def __str__(self):
            return self.surname
    
    class ChosenProduct(models.Model):
        product = models.ForeignKey(Warehouse, on_delete=models.CASCADE)
        quantity = models.IntegerField()
        app_form = models.ForeignKey(App_form, on_delete=models.CASCADE, related_name='chosen_products')
    
        def __str__(self):
            return self.product.product_name

如果您編寫instance.chose_products ,您將訪問manager ,而不是包含項目的QuerySet 您可以使用.all()獲取包含所有對象的QuerySet

print(instance.chosen_products.all())

如果您反向訪問ForeignKey ,則您有一個管理器,因為零個、一個或多個元素可以引用instance

例如,您可以在 selected_products 上進行聚合,例如,如果您想檢索相關的chose_productschose_products ,您可以使用:

print(instance.chosen_products.count())

但是,我建議不要在App_form中存儲(聚合)數據,而是在需要時聚合數據。 數據重復是一種反模式,事實證明很難保持數據同步。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM