Django Rest Framework:如何获取相关外键的实例

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

注意:如果以下信息不清楚 - 请询问我,我会更新 POST 您需要的信息 |对我来说很重要


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

ChosenProduct(models.Model) - quantity

我正在尝试通过 chosen_productsWarehouse 中获取 amount App_formSerializer instance 以添加数量chosen_product

但是我无法从 instance 中获取 chosen_products 个对象 --> 下面输出:

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--------------------

问题已更新


models.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,您将访问 管理器 ,而不是包含项目的 QuerySet。您可以使用 .all() 获取包含所有对象的 QuerySet

print(instance.chosen_products<b>.all()</b>)

如果您反向访问 ForeignKey,则您有一个管理器,因为零个、一个或 更多 个元素可以引用 instance

例如,您可以聚合 chose_products,例如,如果您想检索相关 chose_products 的数量,您可以使用:

print(instance.chosen_products<b>.count()</b>)

不过,我建议不要在 App_form 中存储(聚合)数据,而是在需要时聚合数据。数据重复是一个anti-pattern,事实证明很难保持数据同步。