The main thing to remember is that a batch_get call on a table with a hash key and a range (or sort) key requires both keys for the request. If you have a list of hash keys and the range key is constant, you can use `map` with a `lambda` to combine them into a list of tuples:
```python
list_of_tuples = list(map(lambda x: (x, "constant-range-key"), hash_key_listlike
```
## PynamoDB and batch_get without a Range Key
PynamoDB requires a list of dicts when calling `batch_get` on a model with a hash and range key. If you try calling it with a set or list (which is allowed because not all models will include a range key), then the string hash keys will be interpreted as a tuple of strings, with the first character being interpreted as the hash key and the second one interpreted as a range key.
This could result in head-scratching errors like a duplicate-item error when a set is passed in. This can also happen with BatchWriteItem operations.
### Exceptions
> pynamodb.exceptions.PutError: Failed to batch write items: An error occurred (ValidationException) on request (\$id) on table (\$table) when calling the BatchWriteItem operation: Provided list of item keys contains duplicates
### Pynamo Code for Get
```python
if range_key_attribute:
hash_key, range_key = cls._serialize_keys(item[0], item[1]) # type: ignore
keys_to_get.append({
hash_key_attribute.attr_name: hash_key,
range_key_attribute.attr_name: range_key
})
else:
hash_key = cls._serialize_keys(item)[0]
keys_to_get.append({
hash_key_attribute.attr_name: hash_key
})
```
## Sources
- [[MLE-51#^ju863i|Using Python Lambdas to construct combination keys]]
- [[MLE-51#^5w4ryt|Attempting to use is_in to preserve batch_get and failing]]
- [[MLE-51#^um8ilv|Why a tuple must always be passed to batch_get on a Pynamo model with hash and range keys]]