I think this is the right approach.  get_or_create calls .save(), which is important for ProductVersion due to the special handling for version order precedence that's called from save().  And, it's true.  If you're going behind the scenes, you probably know what you're doing, and creating a product without a version is probably fine.  As your code will likely create your versions later, if that's what you want.  So I think we're good here.