我有以下模型:
class Vendor(models.Model):
name = models.CharField(max_length=50, unique=True)
seo_name = models.SlugField()
def __str__(self):
return self.name
class Product(models.Model):
vendor = models.ForeignKey(Vendor, unique=False, blank=True, default=None, null=True, on_delete=models.SET_NULL)
我制作 xml 文件的解析器,在这些文件中为每个位置设置供应商,我只需要在供应商模型中保存唯一值,但对于每个产品集他的供应商,我是这样的:
for p in products:
vendor = Vendor()
vendor.name = p['vendor']
try:
vendor.save()
except:
pass
product.vendor = vendor
结果是在 Product vendor 的模型中只分配给那些在解析时他们的 vendor 还没有被保存的值。 问题是如何确保将供应商分配给每个产品?
产品中cicle p的所有代码:
def adversolution_aizel(xml_file):
e = ET.parse(xml_file)
d = etree_to_dict(e.getroot())
shop_name = d['yml_catalog']['shop']['name']
shop_company = d['yml_catalog']['shop']['company']
shop_url = d['yml_catalog']['shop']['url']
shop_attr = Shop()
shop_attr.name = shop_name
shop_attr.seo_name = shop_company
shop_attr.import_url = shop_url
try:
shop_attr.save()
except:
pass
products = d['yml_catalog']['shop']['offers']['offer']
for p in products:
product = Product()
product.external_url = p['url']
product.price = p['price']
product.old_price = p['oldprice']
product.currencies = p['currencyId']
# product.category_id = p['categoryId']
#############################################################################
picture = Image()
picture.external_img_url = p['picture']
picture.save()
product.picture = picture
##############################################################################
product.name = p['name']
##############################################################################
vendor = Vendor()
vendor.name = p['vendor']
try:
vendor.save()
except:
pass
product.vendor = vendor
##############################################################################
product.shop = shop_name
product.description = p['description']
product.save()
最佳答案
你应该使用 get_or_create()
供应商方法:
for p in products:
product = Product()
# ...
vendor, _ = Vendor.objects.get_or_create(name=p['vendor'])
product.vendor = vendor # or product.vendor_id = vendor.id
product.shop = shop_name
product.description = p['description']
product.save()
关于python - 我无法在外键中保存唯一值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36386114/