﻿id	summary	reporter	owner	description	type	status	component	version	severity	resolution	keywords	cc	stage	has_patch	needs_docs	needs_tests	needs_better_patch	easy	ui_ux
32332	Relation with non-auto CharField primary key is not correctly persisted if the primary key is defined after assignment	Charlie DeTar	nobody	"Given a model with a foreign key relation to another model that has a non-auto CharField as its primary key:

{{{
class Product(models.Model):
    sku = models.CharField(primary_key=True, max_length=50)

class Order(models.Model):
    product = models.ForeignKey(Product, on_delete=models.CASCADE)
}}}

If the relation is initialized on the parent with an empty instance that does not yet specify its primary key, and the primary key is subsequently defined, the parent does not ""see"" the primary key's change:

{{{
with transaction.atomic():
    order = Order()
    order.product = Product()
    order.product.sku = ""foo""
    order.product.save()
    order.save()

    assert Order.objects.filter(product_id="""").exists()   # Succeeds, but shouldn't
    assert Order.objects.filter(product=order.product).exists()  # Fails
}}}

Instead of `product_id` being populated with `product.sku`, it is set to emptystring.  The foreign key constraint which would enforce the existence of a product with `sku=""""` is deferred until the transaction commits.  The transaction does correctly fail on commit with a `ForeignKeyViolation` due to the non-existence of a product with emptystring as its primary key.

On the other hand, if the related unsaved instance is initialized with its primary key before assignment to the parent, it is persisted correctly:
{{{
with transaction.atomic():
    order = Order()
    order.product = Product(sku=""foo"")
    order.product.save()
    order.save()

    assert Order.objects.filter(product=product).exists()  # succeeds
}}}

Committing the transaction also succeeds.

This may have something to do with how the `Order.product_id` field is handled at assignment, together with something about handling fetching of auto vs non-auto primary keys from the related instance."	Bug	new	Database layer (models, ORM)	3.1	Normal				Unreviewed	0	0	0	0	0	0
