python - 我无法在外键中保存唯一值

标签 python django postgresql

我有以下模型:

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/

相关文章:

Django TEMPLATE_CONTEXT_PROCESSORS 被调用太多次

python - 通过中介模型在 django 中创建与 AUTH_USER_MODEL 的多对多关系

sql - 如何在不对 timescaledb 进行顺序扫描的情况下有效地获取每个 Assets 的最后一个时间戳?

python - 嵌套的 While 循环不起作用

python - 使用 Spearman 相关性和 Sklearn KNN 进行模式匹配

css - 如何让 liveserver 渲染 django 模板?

ruby-on-rails - 如何在方法而不是数据库列上使用 where 子句?

postgresql - 使用 IAM 用户从 Azure Data Studio 连接到 Cloud SQL

python - 以关键字作为变量的 flask sqlalchemy查询

python - 如何找到能被整数10整除的多数整数?