Django Rest Framework:如何获取相关外键的实例
Django Rest Framework: How to get instance of related foreign key
注意:如果以下信息不清楚 - 请询问我,我会更新 POST 您需要的信息 |对我来说很重要
在 Warehouse(models.Model)
我有 amount
属性和
在 ChosenProduct(models.Model)
- quantity
我正在尝试通过 chosen_products
在 Warehouse
中获取 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,事实证明很难保持数据同步。
注意:如果以下信息不清楚 - 请询问我,我会更新 POST 您需要的信息 |对我来说很重要
在 Warehouse(models.Model)
我有 amount
属性和
在 ChosenProduct(models.Model)
- quantity
我正在尝试通过 chosen_products
在 Warehouse
中获取 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,事实证明很难保持数据同步。